通俗易懂讲透牛顿法(牛顿-拉夫森方法)

通俗易懂讲透牛顿法(牛顿-拉夫森方法)|本科生/研究生都能看懂

本文用大白话+切线比喻+公式拆解+可运行代码+可视化,把牛顿法从原理、迭代、收敛、优缺点讲得清清楚楚,适合数值分析、机器学习优化、面试复习。


一、先搞懂:牛顿法到底在干什么?

一句话:
牛顿法是一种用“切线不断逼近”来找函数零点(根)的快速迭代方法。

生活比喻:
你想找曲线 f(x)=0 与 x 轴的交点,但曲线弯弯曲曲不好算。
牛顿法的做法:

  1. 随便猜一个点 x₀
  2. 在这个点画一条切线
  3. 切线与 x 轴交点 → 当成新的猜测点 x₁
  4. 重复几次,几步就能精准扎到真实根

二、为什么要用牛顿法?

普通解方程方法(比如二分法):

  • 步数多
  • 精度上来得慢

牛顿法:

  • 二次收敛(误差越缩越快)
  • 几步就能达到极高精度
  • 是数值优化里最快的算法之一

三、牛顿法核心公式(超级好记)

xn+1=xn−f(xn)f′(xn) x_{n+1}=x_{n}-\frac{f(x_{n})}{f'(x_{n})} xn+1=xnf(xn)f(xn)

拆开讲:

  • xₙ:当前猜测点
  • f(xₙ):函数值
  • f′(xₙ):导数(切线斜率)
  • 减去 f/f′:让你一步跳到切线与x轴的交点

四、原理一句话讲透(不绕弯)

在当前点把函数近似成一条直线(泰勒一阶展开)
然后直接算这条直线的根,
当成下一个更准的猜测。


五、牛顿法完整流程(6步背会)

  1. 选一个初始猜测值 x₀
  2. f(x₀)f′(x₀)
  3. 如果导数接近0 → 停止(切线水平没法算)
  4. 用公式更新:x₁ = x₀ − f/f′
  5. 判断是否收敛(两次x差距很小)
  6. 没收敛就继续迭代

六、收敛速度有多快?(重点)

牛顿法是 二次收敛
误差 ≈ 常数 × 上一次误差的平方

直观感受:

  • 第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()

八、牛顿法优点(面试必背)

  1. 收敛极快:二次收敛,几步就高精度
  2. 精度超高:适合需要精确解的场景
  3. 可扩展到多维:多元牛顿法、优化问题都能用
  4. 理论优美:泰勒展开基础扎实

九、牛顿法缺点(必须知道)

  1. 必须算导数:有些函数求导很难/不可导
  2. 对初始值超级敏感:太远会直接发散
  3. 导数不能为0:否则分母爆炸
  4. 只局部收敛:靠近真根才快
  5. 多维时要算Hessian逆:计算量巨大

十、牛顿法能用来干什么?

✅ 求方程根:多项式、超越方程
✅ 求极值:优化问题(求 f′(x)=0)
✅ 多维非线性方程组
✅ 求平方根、倒数(快速数值计算)
✅ 机器学习优化(牛顿法、拟牛顿法)


十一、什么时候用牛顿法?

  • 函数可导、光滑、稳定
  • 初始值比较接近真实解
  • 想要超快收敛 + 高精度
  • 低维问题(高维用 BFGS/L-BFGS)

十二、一句话总结

牛顿法 = 用切线逼近零点的超级快迭代法,二次收敛、精度极高,但需要导数、依赖初始值,是数值优化与方程求解的“速度之王”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeepModel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值