跳至内容

牛顿法:用迭代逼近快速求根

牛顿法是一种迭代求根算法,利用切线近似来逼近那些没有闭式解的方程的解。
更新 2026年5月4日  · 11分钟

有些方程并没有整洁的代数解。

即使您尽情因式分解或代入,仍有些方程没有闭式解。比如,五次及以上多项式没有通用的代数解。将指数函数与多项式混合的函数,如 e^x = 3x,也属于同类。在这些情形下,您需要换一种方法。

牛顿法正是这种方法。它通过数值方式找根:基于当前估计点处函数切线的指引,不断做出更聪明的猜测。

在本文中,我将带您了解牛顿法背后的公式、逐步的工作流程、何时收敛以及何时不收敛——并辅以具体示例帮助巩固理论。

想了解数据科学家必备的更多数学主题?请阅读我们的博文 等比数列:公式、收敛性与示例,看看它如何应用于金融、物理与计算机科学。

什么是牛顿法?

牛顿法是一种迭代技术,用于寻找函数的根。根是使函数值等于零的自变量取值。

该过程从一个初始猜测开始。方法随后利用该点处函数的几何特性来给出更好的猜测。重复这一过程,每次迭代都会使您更接近真实的根。

核心理念就这么简单:只需要一个聪明、可重复的更新规则,并能收敛到答案。

牛顿法的公式

牛顿法的核心是一个单一的更新规则,反复应用,直到足够接近根。

公式如下:

Newton’s method formula

牛顿法公式

每次迭代以当前估计 x_n 为基础,产生一个更好的估计 x_{n+1}。不断更新,直到结果足够接近零。

该公式包含三个组成部分:

  • x_n —— 您当前对根的估计

  • f(x_n) —— 函数在该估计处的取值

  • f'(x_n) —— 函数在该估计处的导数,表示切线的斜率

f(x_n) 很大,说明离根还远。若 f'(x_n) 很陡,函数变化快,因此可以迈更大一步。比值 f(x_n) / f'(x_n) 精确告诉您应移动多远——从当前猜测中减去它,就能更接近根。

如果 f'(x_n) 为零或接近零,公式将无法正常工作。您会遇到零作分母,意味着方法无法生成下一次估计。关于这一点我会在“局限性”一节中详细说明。

牛顿法如何工作

牛顿法在每次迭代都遵循相同的四个步骤。

  1. 选择初始猜测:选取一个起始值 x_0,使其位于根的附近。无需十分精确——只要足够接近,让函数在该点附近呈现可预期的行为即可。“足够接近”的含义将在收敛性一节中讨论。

  2. 计算函数值:计算 f(x_0)。这告诉您在当前估计处函数距零有多远。如果 f(x_0) = 0,那就完成了——您已找到根。

  3. 计算导数:计算 f'(x_0)。这给出函数在 x_0 处的斜率,即该点处切线的斜率。

  4. 更新估计:按照上一节的公式应用更新规则。

就这样!

新的取值 x_1 是该切线与 x 轴的交点。从几何上看,您在 x_0 处作一条与曲线相切的直线,并沿其延伸到与 x 轴相交。该交点就是您下一个、更好的猜测。

然后重复此过程。将 x_1 代回步骤 2 至 4 得到 x_2,再得到 x_3,以此类推。每次迭代都在更新后的点处作新的切线,并寻找它与 x 轴的交点。

f(x_n) 足够接近零时过程停止——通常当其低于您预先设定的一个小阈值时。

牛顿法的几何解释

想象坐标系中的一条曲线——这就是您的函数 f(x)。根是曲线与 x 轴相交之处。您尚不知道确切的交点,于是从 x 轴上的某个猜测 x_0 开始。

每一步,您在曲线上标出点 (x_0, f(x_0)),再在该点作切线——一条在此处与曲线相切并沿其斜率延伸的直线。该切线不是水平的。它是倾斜的,沿其向下延伸,会在某处与 x 轴相交。该交点就是您的下一次估计 x_1

然后重复。在 x_1 处作新切线,并找到其与 x 轴的交点。得到 x_2。每条切线都是曲线的局部线性近似,而每个交点都会更接近真实的根。

下图展示了将牛顿法应用于 f(x) = x^2 - 2、从 x_0 = 2.5 出发进行两次迭代的情形:

Geometric interpretation chart

几何解释示意图

其可行之处在于:切线是在给定点处对曲线的最佳直线近似。越接近根,切线越像曲线本身——下一步也就越准确。

在实践中,估计值并非缓慢爬近根点,而是迅速跃近,往往每次迭代都能将正确小数位数加倍。

牛顿法的逐步示例

将牛顿法应用于 f(x) = x^2 - 2。该函数的根为 x = sqrt(2) ≈ 1.4142——也就是说,我们在计算 2 的平方根。

其导数为 f'(x) = 2x,因此更新规则变为:

Example (update rule)

示例(更新规则)

让我们从初始猜测 x_0 = 2.5 开始。

第 1 次迭代:

Example (iteration 1)

示例(第 1 次迭代)

第 2 次迭代:

Example (iteration 2)

示例(第 2 次迭代)

第 3 次迭代:

Example (iteration 3)

示例(第 3 次迭代)

仅三次迭代后,我们已精确到四位小数。误差从 1.086(在 x_0 处)降至 0.0001(在 x_3 处)——并且每一步仍在继续减小。

如下图所示,这些估计与误差的变化更直观:

Visual overview of estimate and error

估计与误差的可视化概览

左图展示了每次估计如何逐步逼近 sqrt(2) ≈ 1.4142;右图在对数刻度上显示误差如何缩小——每次迭代大致将上一轮的精度平方。

牛顿法的收敛性

牛顿法可以非常快速地收敛,但前提是满足一定条件。

当初始猜测接近根且函数在该区域内足够光滑时,方法呈现二次收敛。技术上,这就是您在示例中看到的:每次迭代大致将上一轮的误差平方。两位小数变四位,四位变八位,依此类推。

要实现这一点,需要满足两个条件:

  • 良好的初始猜测:x_0 越接近实际的根,收敛越快。若起点太远,该点处的切线可能会把您引向错误方向。
  • 良好性质的函数:函数在根附近需要光滑且可导。剧烈转折或平坦区域会干扰切线近似。

最常见的失效模式是导数接近零。

如果 f'(x_n) 接近零,更新规则中会以一个非常小的数作分母,导致下一次估计远离根。最糟的情况是 f'(x_n) = 0,计算将因无法除以零而停止。

糟糕的起点也可能导致方法振荡或发散。估计值不仅不收敛到根,反而在每次迭代中来回跳动或越走越远。

牛顿法回报良好的设置。只要起点合理、函数平滑,它就能收敛,而且收敛很快。

牛顿法的优势

在条件合适时,牛顿法几乎难以超越。

最大优势是二次收敛。多数数值方法以线性速度逼近根,也就是每次迭代将误差按固定幅度减少。牛顿法则是将误差平方,因此只需很少迭代就能快速达到高精度。

它也具有通用性。您可以将其应用于各种函数——多项式、三角函数、指数函数——而无需做出改变。这也是它能遍布众多领域的原因,从工程仿真到机器学习模型训练皆是如此。

牛顿法的局限性

牛顿法为速度付出的代价也不小。请牢记以下几项局限:

  • 需要导数:在运行任何一次迭代之前,您需要 f'(x) 的解析表达式。对于导数难以计算(或不存在)的函数,需要另寻他法。

  • 对初始猜测敏感:如果起点离根太远,方法可能会把您带向错误方向。

  • 可能不收敛:如果函数存在平坦区域或尖锐转折,切线近似可能并不奏效。

  • 可能发散或振荡:在不利情况下,估计值无法收敛,反而远离根或无限来回跳动。

因此,在使用牛顿法之前,请务必了解您的函数特性。

牛顿法与其他求根方法的比较

牛顿法并非寻找根的唯一方法,也不总是最适合您的那一个。

常见的替代方法有二分法和割线法。下面简要介绍。

二分法

二分法是三者中最简单的。您从区间 [a, b] 开始,其中函数发生了符号变化——意味着区间内必有一根。然后反复将区间对半分,只保留仍然包含符号变化的一半。

它能工作,但较慢。每次迭代将误差减半,属于线性收敛。不过只要函数连续且初始区间确实括住了一根,它就能保证奏效。不需要导数。

割线法

割线法与牛顿法关系密切。它不解析计算导数,而是用前两次估计来近似导数:

Secant method formula

割线法公式

当导数难以计算时,这是一个不错的选择。代价是收敛速度——割线法比二分法快,但比牛顿法慢。

牛顿法的应用

牛顿法广泛应用于科学、工程与机器学习。下面说明具体如何应用。

数值求解方程

这是最直接的应用。当函数没有闭式解时,牛顿法用来找根。在科学计算中这类问题层出不穷——例如寻找化学反应的平衡点,或在信号处理里求解超越方程。

优化

寻找函数 f(x) 的极小值或极大值,意味着寻找其导数 f'(x) = 0 的位置。这是一个求根问题——因此可以应用牛顿法。只是把算法运行在 f'(x) 上,用二阶导 f''(x) 替代一阶导。

这一变体称为优化中的牛顿法,在光滑、性质良好的函数上,其收敛速度快于梯度下降。

机器学习

在机器学习中,训练模型意味着最小化损失函数。牛顿法及其变体在这里有多种用法。

L-BFGS(Limited-memory Broyden-Fletcher-Goldfarb-Shanno,有限内存 BFGS)是一种拟牛顿优化器,通过近似二阶导来避免直接计算。它是逻辑回归等凸问题的常用选择。牛顿法也是统计模型拟合(如广义线性模型)中 Newton-Raphson 更新的基础。

物理与工程

牛顿法在仿真与设计领域随处可见。工程师用它来求解描述物理系统的非线性方程组——如结构应力分析与流体力学。在这些案例中,底层问题都可归约为寻找一组方程等于零的位置。

牛顿法中的常见错误

牛顿法的大多数错误归结为四类。如下:

  • 起点离根太远:不佳的初始猜测是方法发散或振荡的最常见原因。如果您对根的位置没有直观把握,先画出函数图像。这能指引您从哪里开始。

  • 导数求错:更新规则依赖 f'(x)。无论是计算失误还是编码错误,导数一旦不正确,从第一轮迭代开始估计就会出错,而且误差会随迭代累积。

  • 未检查除零:如果 f'(x_n) 等于零或非常接近零,更新步骤将无法执行。在实现中加入保护:若导数低于某个小阈值,停止并报告失败,而不是给出毫无意义的结果。

  • 过早停止:在估计尚未收敛前就截断迭代,会得到一个看似接近却并不准确的答案。将停止条件设在实际误差上——例如 |f(x_n)||x_{n+1} - x_n| 低于您刻意选择的阈值,而非固定的迭代次数。

总结

牛顿法是数值计算中最有用的工具之一。一个更新规则,反复应用,就能在短短几次迭代中将根求到任意精度。

但要为速度付出代价。要想快速收敛,您需要良好的初始猜测、非平坦且不过分尖锐的函数,以及非零导数。理解这些条件,您就知道何时应使用牛顿法,何时应改用其他方法(如二分法或割线法)。

建立直觉的最佳方式是从简单示例练习起。先用 f(x) = x^2 - 2,尝试不同起点,观察结果。再转向具有多个根或平坦区域的函数,看看方法在哪些地方会失效。

如果您喜欢通过迭代进行优化的思路,就一定要了解梯度下降。阅读我们的 机器学习中的梯度下降:深度剖析,了解它如何为机器学习优化模型。

FAQs

牛顿法用于做什么?

牛顿法是一种用于寻找函数根的数值技术——即满足 f(x) = 0x 取值。每当方程没有整洁的代数解时,它就会在科学、工程与机器学习领域登场。常见应用包括求解非线性方程、拟合统计模型,以及为诸如 L-BFGS 的优化算法提供支撑。

牛顿法需要多少次迭代才能收敛?

取决于函数与初始猜测,但在条件合适时,牛顿法通常只需很少的迭代即可收敛。由于二次收敛,每一步大致能将正确小数位数加倍。在实践中,常常只需几次迭代就能达到机器精度。

如果牛顿法不收敛会怎样?

如果初始猜测离根太远,或函数在起点附近存在平坦区域,方法可能会发散或振荡而非收敛。导数接近零是常见诱因——它会让下一次估计严重偏离。在这些情况下,改用更稳定的方法(如二分法),或改进初始猜测,通常可以解决问题。

牛顿法与割线法有何区别?

两者使用的核心更新思想相同,但牛顿法需要解析导数 f'(x),而割线法用前两次估计来近似导数。当导数难以计算时,割线法表现良好,但其收敛速度略慢于牛顿法。

牛顿法中的二次收敛是什么意思?

二次收敛的意思是,每次迭代的误差大致与前一次误差的平方成正比。通俗地讲,如果您已有两位小数的正确性,下一次迭代会给出四位,再下一次是八位,以此类推。这正是牛顿法相较于二分法等方法(每次只将误差减半)更快的原因。

主题

与 DataCamp 一起学习

Courses

Linear Classifiers in Python

4小时
66K
In this course you will learn the details of linear classifiers like logistic regression and SVM.
查看详情Right Arrow
开始课程
查看更多Right Arrow