如何编写循环使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
相关产品推荐
相关产品推荐

