通俗易懂讲透牛顿法(牛顿-拉夫森方法)|本科生/研究生都能看懂
本文用大白话+切线比喻+公式拆解+可运行代码+可视化,把牛顿法从原理、迭代、收敛、优缺点讲得清清楚楚,适合数值分析、机器学习优化、面试复习。
一、先搞懂:牛顿法到底在干什么?
一句话:
牛顿法是一种用“切线不断逼近”来找函数零点(根)的快速迭代方法。
生活比喻:
你想找曲线 f(x)=0 与 x 轴的交点,但曲线弯弯曲曲不好算。
牛顿法的做法:
- 随便猜一个点 x₀
- 在这个点画一条切线
- 切线与 x 轴交点 → 当成新的猜测点 x₁
- 重复几次,几步就能精准扎到真实根
二、为什么要用牛顿法?
普通解方程方法(比如二分法):
- 慢
- 步数多
- 精度上来得慢
牛顿法:
- 二次收敛(误差越缩越快)
- 几步就能达到极高精度
- 是数值优化里最快的算法之一
三、牛顿法核心公式(超级好记)
xn+1=xn−f(xn)f′(xn) x_{n+1}=x_{n}-\frac{f(x_{n})}{f'(x_{n})} xn+1=xn−f′(xn)f(xn)
拆开讲:
- xₙ:当前猜测点
- f(xₙ):函数值
- f′(xₙ):导数(切线斜率)
- 减去 f/f′:让你一步跳到切线与x轴的交点
四、原理一句话讲透(不绕弯)
在当前点把函数近似成一条直线(泰勒一阶展开),
然后直接算这条直线的根,
当成下一个更准的猜测。
五、牛顿法完整流程(6步背会)
- 选一个初始猜测值 x₀
- 算 f(x₀) 和 f′(x₀)
- 如果导数接近0 → 停止(切线水平没法算)
- 用公式更新:x₁ = x₀ − f/f′
- 判断是否收敛(两次x差距很小)
- 没收敛就继续迭代
六、收敛速度有多快?(重点)
牛顿法是 二次收敛:
误差 ≈ 常数 × 上一次误差的平方
直观感受:
- 第1步误差:0.1
- 第2步误差:0.01
- 第3步误差:0.0001
- 第4步误差:0.00000001
几步就几乎完全精确。
七、代码实战:牛顿法求解方程 + 可视化
直接复制可运行,包含:
- 牛顿法实现
- 收敛过程图
- 误差下降图
import numpy as np
import matplotlib.pyplot as plt
# ===================== 1. 牛顿法实现 =====================
def newton_method(f, f_prime, x0, tol=1e-6, max_iter=20):
x = x0
x_history = [x]
for i in range(max_iter):
fx = f(x)
fpx = f_prime(x)
# 避免导数为0
if abs(fpx) < 1e-12:
print("导数接近0,无法继续")
break
# 核心更新公式
x_new = x - fx / fpx
x_history.append(x_new)
# 收敛判断
if abs(x_new - x) < tol:
break
x = x_new
return x_history
# ===================== 2. 要求解的函数:x³ - 2x² -5 = 0 =====================
def f(x):
return x**3 - 2*x**2 - 5
def f_prime(x):
return 3*x**2 - 4*x
# ===================== 3. 运行牛顿法 =====================
x0 = 3.5
history = newton_method(f, f_prime, x0)
root = history[-1]
errors = [abs(x - root) for x in history]
print("真实根 ≈", root)
print("迭代次数:", len(history)-1)
# ===================== 4. 画图:收敛过程 =====================
plt.figure(figsize=(12,5))
plt.subplot(1,2,1)
plt.plot(history, 'o-', c='magenta', label='迭代x值')
plt.axhline(root, c='green', ls='--', label=f'真实根 {root:.5f}')
plt.title('牛顿法收敛过程')
plt.xlabel('迭代步数')
plt.ylabel('x')
plt.grid(True)
plt.legend()
# ===================== 5. 画图:误差下降 =====================
plt.subplot(1,2,2)
plt.plot(errors, 's-', c='orange', label='误差')
plt.yscale('log')
plt.title('误差下降(对数坐标)')
plt.xlabel('迭代步数')
plt.ylabel('误差 |x - root|')
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
八、牛顿法优点(面试必背)
- 收敛极快:二次收敛,几步就高精度
- 精度超高:适合需要精确解的场景
- 可扩展到多维:多元牛顿法、优化问题都能用
- 理论优美:泰勒展开基础扎实
九、牛顿法缺点(必须知道)
- 必须算导数:有些函数求导很难/不可导
- 对初始值超级敏感:太远会直接发散
- 导数不能为0:否则分母爆炸
- 只局部收敛:靠近真根才快
- 多维时要算Hessian逆:计算量巨大
十、牛顿法能用来干什么?
✅ 求方程根:多项式、超越方程
✅ 求极值:优化问题(求 f′(x)=0)
✅ 多维非线性方程组
✅ 求平方根、倒数(快速数值计算)
✅ 机器学习优化(牛顿法、拟牛顿法)
十一、什么时候用牛顿法?
- 函数可导、光滑、稳定
- 初始值比较接近真实解
- 想要超快收敛 + 高精度
- 低维问题(高维用 BFGS/L-BFGS)
十二、一句话总结
牛顿法 = 用切线逼近零点的超级快迭代法,二次收敛、精度极高,但需要导数、依赖初始值,是数值优化与方程求解的“速度之王”。
&spm=1001.2101.3001.5002&articleId=160005408&d=1&t=3&u=fd5b9de71938461a9b1272382219e249)
653

被折叠的 条评论
为什么被折叠?



