You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现Newton-Raphson法求多项式根语法错误咨询

错误原因排查

  • 直接触发SyntaxError的原因是关键字拼写错误:你将lambda误写为lamda,缺少了字母b。
  • 除此之外你的代码还存在多处逻辑、语法、需求匹配问题:
    1. 代码执行顺序逻辑错误:return xnew, i写在for循环第一次迭代的流程中,且y的定义在return之后,这行代码永远不会被执行
    2. 函数调用逻辑矛盾:你同时将入参fn作为列表取fn[0],又作为普通函数调用fn(x),逻辑完全不成立
    3. 变量未定义:你写的lambda表达式中a/b/c都是未定义的变量,且硬编码只能适配二次多项式,不符合题目要求的支持任意高次多项式的需求
    4. 迭代逻辑错误:满足容限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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:54:00