牛顿法
一、直观理解:用切线一步步逼近交点
牛顿法(Newton-Raphson)求 时,在当前点 处用切线代替曲线,把切线零点当作下一个近似:
若初值靠近单根且 不太小,收敛极快(二次收敛):有效数字往往每次迭代接近翻倍。
多维情形对应牛顿法解 ,每步解线性系统 ,在优化与隐式方程中无处不在。
二、适用场景与优缺点
| 类型 | 说明 |
|---|---|
| 适用场景 | 光滑可导;能算 或可靠差商;有较好初值;需要快速高精度。 |
| 核心优点 | 局部二次收敛;易推广到高维;与优化中的牛顿法一脉相承。 |
| 局限与缺点 | 全局收敛无保证; 会爆炸;多重根降速;差的初值可能发散或进入循环。 |
三、核心原理
泰勒展开 ,令其为 0 得牛顿步。对简单根,误差满足
改进
- 阻尼牛顿:, 保证下降;
- 结合二分:先用括号保证区间,再用牛顿加速;
- 多重根:使用修正牛顿 或求 的根。
四、实践要点
- 给最大迭代次数与容差( 与 );
- 监控 是否过小;
- 多初值尝试;
- 高维时用解析雅可比或稀疏差分。
五、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);
六、如何解释结果
报告初值、迭代次数、最终 或 、是否二次收敛迹象(误差对数曲线斜率)。若失败,说明是初值、多重根还是导数问题。
七、常见误区
1. 当全局算法用
牛顿法是局部方法,需要好初值或线搜索/混合策略。
2. 忽视
水平切线导致一步飞走。
3. 把差商步长设得极端
过大有截断误差,过小有舍入误差。
4. 不验证
迭代停滞不等于找到根。
附:建模流程中的落地清单(牛顿法)
在竞赛或课程论文中,仅写出定义式往往不够。建议按下列顺序组织材料,既能保证可复现,也便于评委快速抓住贡献。
1. 问题对齐
先用两三句话说明:题目中的哪个子问题对应本方法,输入是什么,输出要支持什么决策。避免“因为常见所以使用”。若存在更简单的替代方法,应说明为何不够用。
2. 符号与单位
列出核心符号表,强调单位一致。许多错误并非算法失败,而是日/年、米/千米、概率/百分比混用。对无量纲参数,说明取值来源(估计、文献、情景设定)。
3. 关键公式回顾
牛顿步来自一阶线性化。单根附近二次收敛;多重根或 时会显著退化。
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. 何时不该使用
把局部算法当全局保证;或在导数近零时不设保护仍宣称收敛。
完成以上清单后,再进入“小结”中的一句话金句,通常论文的方法段与验证段就会扎实许多。
八、小结
牛顿法利用切线线性化快速求根,在光滑且初值良好时效率极高,并自然推广到非线性方程组。建模中应把它与稳健的括号法、阻尼策略结合,同时报告初值敏感性。