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

如何编写循环使Newton-Raphson方法迭代直至计算结果收敛

Newton-Raphson迭代收敛循环实现修正

原代码核心问题

  • 循环条件逻辑错误:原代码while (x0 - x) <= 10**-8完全写反,收敛的要求是差值小于阈值才停止,所以循环应该在差值大于等于阈值时持续运行,同时必须对差值取abs(),避免迭代方向导致差值为负直接跳出循环
  • 迭代变量未同步更新:原代码只在循环外计算了一次初始x,循环内从未更新x的值,对比基准永远是第一次迭代的结果,逻辑完全失效
  • 缺少初始x0定义:代码中直接使用未赋值的x0变量,运行会直接抛出NameError
  • 无兜底终止条件:未设置最大迭代次数限制,若遇到迭代发散、导数为0的场景会直接陷入死循环

修正后可运行代码

def newton_step(f, fp, x0):
    return x0 - (f(x0)/fp(x0))

def f(x):
    return x**3 + x**2 + 2 

def fp(x): 
    return 3*x**2 + 2*x

# 迭代参数配置
x0 = -2  # 迭代初始值,可根据求解需求调整
threshold = 1e-8  # 收敛阈值
max_iter = 100  # 最大迭代次数,防止死循环
iter_count = 0

while iter_count < max_iter:
    x_new = newton_step(f, fp, x0)
    iter_count += 1
    # 检查是否满足收敛条件
    if abs(x_new - x0) < threshold:
        print(f"迭代收敛,最终解为:{x_new},迭代次数:{iter_count}")
        break
    # 更新上一轮迭代值,进入下一次计算
    x0 = x_new
    print(f"第{iter_count}次迭代结果:{x_new}")
else:
    print(f"已达到最大迭代次数{max_iter},仍未收敛,当前结果:{x_new}")

运行说明

你提供的测试函数f(x) = x³ + x² + 2的实根约为-1.6180339887,使用上述代码设置初始值为-2时,迭代5次左右即可满足1e-8的收敛精度要求。

内容的提问来源于stack exchange,提问作者Amnesia Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:24:04