编写牛顿法程序时f(x)输入重复触发问题求助
问题根源
你的f(x)函数定义存在逻辑错误:每次调用f(x)都会执行input("f(x):"),这意味着所有调用f(x)的场景都会触发用户输入——比如计算导数时调用f(x)会弹一次输入,while循环里每轮迭代调用f(x0)又会弹一次,自然会重复出现输入请求。
修正方案
让用户只输入一次函数表达式,用这个表达式统一定义函数和计算导数,避免重复输入。修正后的代码如下:
import sympy as smp x = smp.symbols('x') x0 = float(input("Initial Value:")) k = 1 n = int(input("Number of iterations:")) # 只让用户输入一次函数表达式 expr_str = input("f(x):") expr = smp.sympify(expr_str) # 将符号表达式转为可调用的数值函数 f = smp.lambdify(x, expr) # 计算导数并转为数值函数 f_prime = smp.lambdify(x, smp.diff(expr, x)) while k <= n: r = x0 - (f(x0) / f_prime(x0)) print(f"root: {r}, iteration: {k}") k += 1 x0 = r
关键改动说明
- 提前获取用户输入的函数表达式,存入
expr_str,再转为sympy的符号表达式expr - 用
lambdify把符号表达式转成可以直接传入数值计算的函数f和f_prime,避免每次调用都触发输入 - 求导直接基于符号表达式
expr,不再调用会触发输入的f(x)
内容的提问来源于stack exchange,提问作者Matthew_F
相关产品推荐
相关产品推荐

