跳到主要内容

牛顿法

一、直观理解:用切线一步步逼近交点​

牛顿法(Newton-Raphson)求 f(x)=0f(x)=0 时,在当前点 xkx_k 处用切线代替曲线,把切线零点当作下一个近似:

xk+1=xk−f(xk)f′(xk)x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)}

若初值靠近单根且 f′f' 不太小,收敛极快(二次收敛):有效数字往往每次迭代接近翻倍。

多维情形对应牛顿法解 F(x)=0F(x)=0,每步解线性系统 JF(xk)s=−F(xk)J_F(x_k)s=-F(x_k),在优化与隐式方程中无处不在。

二、适用场景与优缺点​

类型说明
适用场景ff 光滑可导;能算 f′f' 或可靠差商;有较好初值;需要快速高精度。
核心优点局部二次收敛;易推广到高维;与优化中的牛顿法一脉相承。
局限与缺点全局收敛无保证;f′≈0f'\approx0 会爆炸;多重根降速;差的初值可能发散或进入循环。

三、核心原理​

泰勒展开 f(xk+s)≈f(xk)+f′(xk)sf(x_k+s)\approx f(x_k)+f'(x_k)s,令其为 0 得牛顿步。对简单根,误差满足

ek+1≈f′′(x∗)2f′(x∗)ek2e_{k+1}\approx\frac{f''(x^*)}{2f'(x^*)}e_k^2

改进​

  • 阻尼牛顿:xk+1=xk−λf/f′x_{k+1}=x_k-\lambda f/f',λ∈(0,1]\lambda\in(0,1] 保证下降;
  • 结合二分:先用括号保证区间,再用牛顿加速;
  • 多重根:使用修正牛顿 x−mf/f′x-mf/f' 或求 f/f′f/f' 的根。

四、实践要点​

  1. 给最大迭代次数与容差(∣f∣|f| 与 ∣xk+1−xk∣|x_{k+1}-x_k|);
  2. 监控 f′f' 是否过小;
  3. 多初值尝试;
  4. 高维时用解析雅可比或稀疏差分。

五、MATLAB 示例​

%% 一维牛顿法: f(x)=cos(x)-x
f = @(x) cos(x) - x;
df = @(x) -sin(x) - 1;
x = 0.5;
tol = 1e-12;
for k = 1:50
fx = f(x); dfx = df(x);
if abs(dfx) < 1e-14
error("导数过小");
end
xNew = x - fx/dfx;
if abs(xNew - x) < tol && abs(fx) < tol
x = xNew; break;
end
x = xNew;
end
fprintf("牛顿根 = %.12f, 迭代=%d, f=%.3e\n", x, k, f(x));
fprintf("fzero = %.12f\n", fzero(f, 0.5));
%% 二维牛顿: F(x,y)=0
% x^2 + y^2 - 1 = 0
% x^2 - y = 0
F = @(z) [z(1)^2 + z(2)^2 - 1; z(1)^2 - z(2)];
J = @(z) [2*z(1), 2*z(2); 2*z(1), -1];
z = [0.8; 0.5];
for k = 1:20
s = - J(z) \ F(z);
z = z + s;
if norm(s) < 1e-12, break; end
end
fprintf("二维根 ≈ (%.10f, %.10f), ||F||=%.3e, 迭代=%d\n", z, norm(F(z)), k);

六、如何解释结果​

报告初值、迭代次数、最终 ∣f∣|f| 或 ∥F∥\|F\|、是否二次收敛迹象(误差对数曲线斜率)。若失败,说明是初值、多重根还是导数问题。

七、常见误区​

1. 当全局算法用​

牛顿法是局部方法,需要好初值或线搜索/混合策略。

2. 忽视 f′=0f'=0​

水平切线导致一步飞走。

3. 把差商步长设得极端​

过大有截断误差,过小有舍入误差。

4. 不验证 f(root)≈0f(\mathrm{root})\approx0​

迭代停滞不等于找到根。

附:建模流程中的落地清单(牛顿法)​

在竞赛或课程论文中,仅写出定义式往往不够。建议按下列顺序组织材料,既能保证可复现,也便于评委快速抓住贡献。

1. 问题对齐​

先用两三句话说明:题目中的哪个子问题对应本方法,输入是什么,输出要支持什么决策。避免“因为常见所以使用”。若存在更简单的替代方法,应说明为何不够用。

2. 符号与单位​

列出核心符号表,强调单位一致。许多错误并非算法失败,而是日/年、米/千米、概率/百分比混用。对无量纲参数,说明取值来源(估计、文献、情景设定)。

3. 关键公式回顾​

牛顿步来自一阶线性化。单根附近二次收敛;多重根或 f′≈0f'\approx0 时会显著退化。

4. 计算与实现要点​

  • 固定随机种子(若涉及随机);
  • 记录中间量以便手算核对小例子;
  • 用极限情形或解析特例做冒烟测试;
  • 保存主要输入输出到表格,便于敏感性分析复用。

5. 补充 MATLAB 片段​

f=@(x)x.*exp(x)-1; df=@(x)exp(x).*(x+1); x=0.5;
for k=1:20, x=x-f(x)/df(x); if abs(f(x))<1e-12, break; end, end; disp([x f(x) k]);

6. 结果报告模板​

建议至少报告:初值、迭代史、最终残差、是否与 fzero 一致、多初值是否给出同一根。

7. 何时不该使用​

把局部算法当全局保证;或在导数近零时不设保护仍宣称收敛。

完成以上清单后,再进入“小结”中的一句话金句,通常论文的方法段与验证段就会扎实许多。

八、小结​

牛顿法利用切线线性化快速求根,在光滑且初值良好时效率极高,并自然推广到非线性方程组。建模中应把它与稳健的括号法、阻尼策略结合,同时报告初值敏感性。