Python实现Newton-Raphson法求多项式根语法错误咨询
错误原因排查
- 直接触发SyntaxError的原因是关键字拼写错误:你将
lambda误写为lamda,缺少了字母b。 - 除此之外你的代码还存在多处逻辑、语法、需求匹配问题:
- 代码执行顺序逻辑错误:
return xnew, i写在for循环第一次迭代的流程中,且y的定义在return之后,这行代码永远不会被执行 - 函数调用逻辑矛盾:你同时将入参
fn作为列表取fn[0],又作为普通函数调用fn(x),逻辑完全不成立 - 变量未定义:你写的lambda表达式中
a/b/c都是未定义的变量,且硬编码只能适配二次多项式,不符合题目要求的支持任意高次多项式的需求 - 迭代逻辑错误:满足容限break后没有对应返回逻辑,不满足的话也不会进入下一轮迭代
- 代码执行顺序逻辑错误:
符合需求的正确实现
首先我们需要根据输入的系数元组,通用计算任意次多项式的值、以及它的一阶导数值,再执行Newton-Raphson迭代:
def NR_Root(coefficients, guess, epsilon): max_iter = 1000 # 防止死循环设置最大迭代次数 x_current = guess n = len(coefficients) - 1 # 多项式最高次 for _ in range(max_iter): # 计算当前x对应的多项式值p(x) p = 0 for i, coeff in enumerate(coefficients): degree = n - i p += coeff * (x_current ** degree) # 计算一阶导数值p'(x) p_deriv = 0 for i, coeff in enumerate(coefficients): degree = n - i if degree == 0: # 常数项导数为0,跳过 continue p_deriv += coeff * degree * (x_current ** (degree - 1)) # 避免除以0的异常 if abs(p_deriv) < 1e-12: raise ValueError("导数接近0,无法继续迭代,请调整初始猜测值") # 计算新的近似值 x_new = x_current - p / p_deriv # 检查是否满足误差要求 if abs(x_new - x_current) < epsilon: return x_new x_current = x_new # 达到最大迭代次数仍未收敛 raise RuntimeError("达到最大迭代次数,未找到符合精度要求的根")
测试示例
比如求多项式x² - 2 = 0的正根,系数元组为(1, 0, -2),初始猜测值为1,误差容限0.0001:
print(NR_Root((1, 0, -2), 1, 0.0001)) # 输出结果接近1.4142,即√2,符合预期
内容的提问来源于stack exchange,提问作者Johnny Azar
相关产品推荐
相关产品推荐

