牛顿-拉弗森法模拟器 返回
数值分析模拟器

牛顿-拉弗森法 模拟器 — 非线性方程的根

以 f(x)=x³−2x−5 为例,牛顿迭代 x_{n+1}=x_n−ω·f(x_n)/f'(x_n) 的收敛过程通过切线和误差曲线实时可视化。初始值·许容差·松弛系数自由调整。

参数
初始值 x_02.00
最大迭代次数20
许容差 1e^−n6
松弛系数 omega1.00
计算结果
收敛的根
迭代次数
最终 |f(x)|
收敛状态
函数和切线(f(x)=x³−2x−5)
误差 |f(x_n)| 的收敛(log10)
理论与主要公式

$$x_{n+1} = x_n - \omega\,\frac{f(x_n)}{f'(x_n)}$$

牛顿-拉弗森迭代式。ω:松弛系数(1.0 为纯牛顿法,<1 为阻尼牛顿法)。

$$f(x) = x^{3} - 2x - 5, \qquad f'(x) = 3x^{2} - 2$$

测试函数(牛顿本人的原始例题)。实根为 x ≈ 2.094551482。

$$|f(x_n)| \lt \varepsilon \quad \text{或} \quad |x_{n+1} - x_n| \lt \varepsilon$$

收敛判定。ε(许容差)为 1e^−n(n 为许容差滑块)。

什么是牛顿-拉弗森法

方程 f(x)=0 的解通过在当前估计点的切线进行线性化来确定下一个估计点的反复解法。作为有限元非线性求解器的核心,是日常运行中最古老且最实用的数值方法之一。

🙋
这个模拟器,当初始值 x_0 = 2 时,3 次迭代就找到了根,但当 x_0 = −2 时突然发散了。同一个方程怎么会这样?
🎓
牛顿法是"用切线瞄准根"的方法,当切线斜率 f'(x) 很小时,切线接近水平,与 x 轴的交点会飞到很远的地方。f(x)=x³−2x−5 的 f'(x)=3x²−2 在 x=±√(2/3)≈±0.816 处为零。从 x_0=−2 出发,轨道会横越那个不稳定区域,一下子跳到图的右端或左端。当你在模拟器中移动初始值滑块,同时观察下面的误差曲线(log10),会清楚地看到"光滑递减的情况"和"振荡并跳升的情况"的明显区别。
🙋
明白了!那如果我把松弛系数 ω 的滑块改成 0.5,初始值不好时也能收敛吗?
🎓
完全正确!将更新量缩小到 ω 倍,原本容易失控的迭代会变得稳定并容易收敛。这被称为"阻尼牛顿法",在 Abaqus 或 ANSYS 的非线性结构分析中也内部使用了同样的技巧。但如果 ω 太小,原本的二阶收敛(误差在每次迭代中大约以平方缩小)就会被破坏,退化为一阶收敛(线性)。在模拟器中比较 ω=1.0 和 ω=0.3 的误差曲线,斜率的差异(凸下降还是直线下降)应该很明显。
🙋
许容差改成 1e^−12 时迭代次数会增加吗?而且,设这么小有意义吗?
🎓
好问题。纯牛顿法的二阶收敛力量很强,从 1e^−6 缩小到 1e^−12 只需 1~2 次额外迭代。所以"许容差更严格"也不会显著增加计算成本。但实务中,倍精度浮点的限界(约 1e^−15)和残差的评估误差(数值积分、模型不确定性)会先成为瓶颈。线性结构分析通常用 1e^−6,非线性用 1e^−4 ~ 1e^−5 相对残差,这是行业标准。

物理模型和主要公式

牛顿-拉弗森法在光滑函数 f(x) 的当前估计点 x_n 周围进行一阶泰勒展开,将其线性近似为零的点作为下一个估计值。

$$f(x) \approx f(x_n) + f'(x_n)(x - x_n) = 0 \;\Rightarrow\; x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}$$

引入松弛系数 ω 的阻尼牛顿法形式:

$$x_{n+1} = x_n - \omega\,\frac{f(x_n)}{f'(x_n)}, \quad 0 \lt \omega \le 1$$

二阶收敛性(关于误差 e_n = x_n − x*):

$$|e_{n+1}| \le \frac{|f''(x^{*})|}{2|f'(x^{*})|}\,|e_{n}|^{2}$$

也就是说,在根的附近,每次迭代时有效数字数量大约翻倍。这是牛顿法的最大魅力。

实际应用

非线性结构分析(CAE):材料非线性(弹塑性)、几何非线性(大变形)、接触分析的平衡迭代中,用牛顿-拉弗森法求解残差力 R(u)=F_int(u)−F_ext=0。刚度矩阵 K=∂R/∂u 对应于"f'(x)"。

电路仿真(SPICE):非线性器件(二极管、MOSFET)的直流工作点分析中,用牛顿迭代解基尔霍夫方程 g(V)=0。每次迭代生成的线性化系统(雅可比矩阵)规模决定计算时间。

机器学习和优化:用牛顿法求解梯度 ∇f(x)=0,利用二阶导数(黑塞矩阵)可得高速收敛。准牛顿法(BFGS)是近似黑塞的衍生方法。

天体力学和轨道计算:求解开普勒方程 M = E − e·sin E 关于离心近点角 E,标准使用牛顿-拉弗森法。卫星跟踪和轨道预报计算中必需。

常见误解和注意事项

首先最危险的误解是"二阶收敛,所以初始值随便选"。牛顿法的二阶收敛仅在"根的充分近处"成立,初始值不好就容易发散或跳到另一个根。实务中常用"混合法":先用二分法或黄金分割搜索将根的存在区间收缩,再切换到牛顿法。Brent 法是这一思想的经典实现。

其次是 f'(x) ≈ 0 的地方。切线接近水平时,更新量 f/f' 会异常巨大。在模拟器中把 x_0 放在 0.8 附近,f'(0.8)=3(0.64)−2=−0.08 非常小,下一步会一下子飞很远。为避免这点,实现中常会:当 |f'| 小于阈值时缩小 ω,或对更新量设上限(line search、trust region)。

最后是"收敛了=解对了"的陷阱。当 f(x)=0 有多个根时(虽然这个工具的 f(x)=x³−2x−5 只有一个实根,一般三次式有三个),初始值不同会收敛到不同的根。有限元的非线性结构分析也一样,座屈、跳跃后的解有多个"正确的"平衡态,需用弧长法(Riks 法)等特殊迭代来追踪路径。

常见问题

用中心差分 (f(x+h)−f(x−h))/(2h) 等数值微分代替 f'(x),这就是"割线法(Secant method)";或用过去的估计值来近似雅可比的"Broyden 法"。有限元中常见"修改牛顿法",即不更新刚度矩阵而复用旧值来节省成本。
在重根 x* 处 f'(x*)=0,纯牛顿法的收敛阶从二阶退化为一阶(线性)。用修改公式 x_{n+1}=x_n − m·f/f'(m 为重数)可恢复二阶收敛。若重数未知,可用 Schroder 迭代 x_{n+1}=x_n − f·f'/((f')²−f·f'') 。
可以。向量方程 F(x)=0 用 Δx = −J(x_n)⁻¹ F(x_n) 更新(J 为雅可比矩阵)。有限元的非线性分析就是这样,J 对应刚度矩阵 K。实现中不直接求 J 的逆,而用线性求解器(LU 分解、迭代法)解 K·Δu=−R 。
倍精度浮点的机器精度(约 2.2e−16)是原理底线,无法突破。而且 f(x) 自身的计算就有舍入误差和数值积分打切误差,许容差比这些还小就没意义了。实务上"相对残差 < 1e−6 ~ 1e−4"是标准做法,用初始残差来正规化而非绝对残差。

使用指南

  1. 用滑块 slX0 设置初始值 X0。求解非线性方程 f(x)=x³-2x-5=0 的根时,建议从 X0=2.0 附近开始。
  2. 指定最大迭代次数 slMaxIter(例:50次)和收敛判定指数 slTolExp(例:1e-6),用松弛系数 slOmega 调整收敛速度。ω 通常在 0.8~1.2 范围,1.0 是标准牛顿-拉弗森法。
  3. 模拟运行后,在图表中可视化确认反复点的收敛过程,从"收敛的根""迭代次数""最终 |f(x)|"等统计值评估解的精度。

具体计算例子

以材料常数决定问题为例。应力σ=200 MPa 下的塑性应变εp满足方程 f(ε)=150ε³-40ε²+8ε-1.5=0,用 X0=0.3、最大迭代50次、TOL=1e-8、ω=1.0 运行,通常 3~4 次迭代就能收敛到根ε≈0.268。最终 |f(x)| 降到 1.2e-9 以下,作为有限元的材料律输入值具有可信度。

实务中的注意事项

  1. 机械设计的接触应力计算(Hertz 应力)中初始值很关键,X0 要在根的预估值 ±20% 以内,否则有发散风险。
  2. 结构分析的非线性收敛中,用松弛系数ω<1.0(例:0.9)可抑制振荡,在大变形问题上稳定收敛。
  3. 化学反应速率式等复根附近,如果 TOL 过严(1e-12 以下),浮点误差会导致无限循环,应在工序中设定 1e-6~1e-9 范围。