1 问题简介¶
1.1 根与重根¶
定义 1.1(根与重根)
若存在 \(x^*\) 使得
则称 \(x^*\) 为方程 \(f(x)=0\) 的根,或函数 \(f(x)\) 的零点。
若
其中 \(m\) 为正整数,则称 \(x^*\) 为 \(m\) 重根。
1.2 根的存在性¶
定理 1.1(介值定理)
设 \(f(x)\) 在 \([a,b]\) 上连续,且
则方程 \(f(x)=0\) 在 \((a,b)\) 内至少存在一个根。
这一定理是二分法的基础:只要区间两端异号,就可以不断缩小含根区间。
2 二分法¶
2.1 方法思想¶
设 \(f(x)\) 在 \([a,b]\) 上连续,且 \(f(a)f(b)<0\)。令
若 \(f(p)=0\),则 \(p\) 就是根;否则根据符号选择新的含根区间:
- 若 \(f(a)f(p)<0\),根在 \([a,p]\);
- 若 \(f(p)f(b)<0\),根在 \([p,b]\)。
重复这个过程,直到区间长度小于指定阈值。
2.2 算法¶
算法 2.1(二分法)¶
2.3 收敛性与稳定性¶
经过 \(k\) 次二分后,区间长度为
因此若希望误差不超过 \(\varepsilon\),只需
二分法稳定、可靠,但收敛速度只有线性,且要求初始区间两端异号。
停止条件
不能把 \(\varepsilon\) 设置得任意小。浮点计算中常取
量级的下界,否则可能因为浮点精度限制导致迭代无法有效终止。
例 2.1:二分法求根
求
在 \([0.2,3.6]\) 中的根。
有
首次中点 \(p=1.9\),\(f(1.9)=-1.045125\),故根在 \([1.9,3.6]\)。继续取中点 \(2.75\)、\(3.175\)、\(2.9625\),不断缩小区间,最终收敛到约
3 不动点迭代法¶
3.1 不动点¶
定义 3.1(不动点)
若
则称 \(x^*\) 为函数 \(\phi(x)\) 的不动点。
将方程 \(f(x)=0\) 改写成等价形式
即可构造迭代格式
若 \(x_k\to x^*\),则 \(x^*\) 是不动点,也对应原方程的根。
3.2 算法¶
算法 3.1(不动点迭代法)¶
3.3 收敛定理¶
定理 3.1(压缩映射条件)
设 \(\phi(x)\) 在 \([a,b]\) 上连续可导,并满足:
且存在常数 \(0<L<1\),使得
则:
- \(\phi(x)\) 在 \([a,b]\) 上存在唯一不动点 \(x^*\);
- 对任意 \(x_0\in[a,b]\),迭代 \(x_{k+1}=\phi(x_k)\) 都收敛到 \(x^*\);
- 误差满足
判断迭代格式好坏
同一个方程可以改写成多个不动点格式。收敛性主要取决于根附近 \(|\phi'(x^*)|\) 的大小:小于 1 通常收敛,越小越快;大于 1 往往发散。
例 3.1:不同迭代格式
对
可构造多种等价格式,例如
初值取 \(x_0=1\) 时,课件数值结果显示 \(\phi_1\) 发散,而 \(\phi_2,\phi_3\) 收敛到同一根附近。这说明“方程等价”不代表“迭代行为等价”。
4 收敛阶与误差分析¶
4.1 收敛阶¶
设迭代序列 \(x_k\to x^*\),误差 \(e_k=x_k-x^*\)。若存在 \(p\geq1\) 和 \(C>0\),使得
则称该迭代具有 \(p\) 阶收敛。
- \(p=1\):线性收敛;
- \(p=2\):二阶收敛;
- \(p>1\):超线性收敛。
4.2 不动点迭代的局部误差¶
由 Taylor 展开
若 \(\phi'(x^*)\neq0\) 且 \(|\phi'(x^*)|<1\),则通常为线性收敛:
若 \(\phi'(x^*)=0\) 且 \(\phi''(x^*)\neq0\),则通常为二阶收敛:
5 松弛法¶
5.1 松弛迭代¶
对方程 \(f(x)=0\),可构造
其中 \(\omega\) 为松弛因子。它也可看成不动点迭代:
在根 \(x^*\) 附近,
若希望局部收敛,需要
即当 \(f'(x^*)>0\) 时,通常要求
5.2 最优局部选择¶
若能取
则 \(\phi'(x^*)=0\),局部收敛阶可由线性提升到二阶。这正是 Newton 法的思想来源:用当前点的导数近似根处导数。
6 Newton 法¶
6.1 迭代格式¶
对 \(f(x)=0\),在 \(x_k\) 处作一阶 Taylor 展开:
令右端为 0,得到 Newton 迭代:
6.2 几何意义¶
Newton 法用曲线在当前点的切线与 \(x\) 轴的交点作为下一次近似。因此若初值足够靠近单根且 \(f'(x^*)\neq0\),通常收敛非常快。
用几何语言描述,第 \(k\) 步迭代时,点 \((x_{k+1}, 0)\) 是曲线 \(y=f(x)\) 在点 \((x_k, f(x_k))\) 处的切线
与 \(x\) 轴的交点,如下图所示。



从图中可以看到,Newton 法迭代迅速逼近真实根 \(x^*=\sqrt{2}\approx1.4142\)。
6.3 收敛性分析¶
定理 6.1(Newton 法局部二阶收敛)
假设 \(f(x)\) 二阶可导,如果 \(x_0\) 充分接近 \(f(x)\) 的一个单根 \(x^*\),并且 \(f'(x)\neq0\) 在根附近成立,那么 Newton 法收敛于 \(x^*\),并且收敛速度为 二阶。即存在常数
使得
证明
根据 \(f(x)\) 在 \(x=x_k\) 处的 Taylor 展开:
其中 \(\xi_k\) 是 \(x\) 与 \(x_k\) 之间的某个数。令 \(x=x^*\),并根据 \(f(x^*)=0\),得到
假设 \(f'(x_k)\neq0\),整理得
将 Newton 迭代格式 \(x_{k+1}=x_k-\dfrac{f(x_k)}{f'(x_k)}\) 代入上式,得到误差关系:
因此,对上式求极限,并根据 \(\xi_k\) 介于 \(x_k\) 与 \(x^*\) 之间,可以得到 \(\lim_{k\to\infty}\xi_k=x^*\)。于是定理得证。\(\square\)
直观理解
Newton 法之所以能达到二阶收敛,本质上是利用了一阶 Taylor 展开来局部逼近函数。在单根附近,线性近似足够好,因此误差平方衰减。
例 6.1:Newton 法求解 \(f(x)=x^2-2\)
采用 Newton 法计算 \(f(x)=x^2-2\) 的正根,取初始猜测 \(x_0=0.8\)。
导数 \(f'(x)=2x\),因此 Newton 迭代格式为
各阶迭代结果及与真实解 \(x^*=\sqrt{2}\) 的误差如下:
| \(k\) | \(x_k\) | \(|e_k|\) | | --- | --- | --- | | 0 | 0.80000000 | \(6.14\times10^{-1}\) | | 1 | 1.65000000 | \(2.36\times10^{-1}\) | | 2 | 1.43106061 | \(1.68\times10^{-2}\) | | 3 | 1.41431273 | \(9.92\times10^{-5}\) | | 4 | 1.41421357 | \(3.48\times10^{-9}\) | | 5 | 1.41421356 | \(2.22\times10^{-16}\) |
可以看到误差从 \(10^{-1}\) 量级迅速降到 \(10^{-16}\),每步有效数字约翻倍,充分展示了二阶收敛的速度。
6.4 重根情况¶
若 \(f(x)\) 在 \(x=x^*\) 处有 \(m\) 重根 \((m>1)\),即
其中 \(g(x^*)\neq0\),并假设 \(g(x)\) 有二阶导数。此时
Newton 法的标准迭代格式在重根处的收敛性会发生变化。从误差入手:
于是
其中 \(\xi_k\) 和 \(\eta_k\) 为介于 \(x_k\) 与 \(x^*\) 之间的两个数。令 \(k\to\infty\) 求极限,得到收敛阶为 \(1-\dfrac{1}{m}\)。于是,在重根的情况下,Newton 法不再是平方收敛。
重根使 Newton 法降阶
当 \(m=2\)(二重根)时,Newton 法的收敛阶降为 \(1-\dfrac{1}{2}=0.5\),这甚至比线性收敛还要慢(误差比趋于 1),实际表现为次线性收敛。
改善重根收敛性的方法¶
方法一:已知重数 \(m\)
将迭代格式更换成
此时误差比为
恢复了二阶收敛。
方法二:未知重数 \(m\)
令
无论 \(f(x)\) 的根 \(x^*\) 重数是多少,\(x^*\) 都是 \(h(x)\) 的 单根。于是对 \(h(x)=0\) 应用 Newton 法,迭代格式为
这种方法不需要预先知道重数 \(m\),同样能恢复二阶收敛。
例 6.2:重根处的收敛对比
考虑 \(f(x)=(x-1)^2(x+1)\),在 \(x^*=1\) 处有二重根。分别采用标准 Newton 法、改进方法 1(已知 \(m=2\))和改进方法 2(\(h(x)\) 方法)进行迭代。
三种方法的迭代格式依次为:
标准 Newton 法:
改进方法 1:
改进方法 2:
数值实验得到的绝对误差随迭代次数的变化如下图所示。

从图中可以清楚看到:标准 Newton 法收敛极慢(次线性),而两种改进方法都快速达到机器精度。
6.5 收敛域的改善¶
Newton 法要求初始值 \(x_0\) 足够接近方程的根 \(x^*\);否则,Newton 法可能不收敛。
例 6.3:Newton 法发散的例子
验证 Newton 法计算非线性方程
取初值 \(x_0=1\)。迭代格式为
计算得到迭代序列:
迭代在 \(-1\) 和 \(1\) 之间震荡,永不收敛。

阻尼 Newton 法¶
为了扩大 Newton 法的收敛域,一种常见的改进称为 阻尼 Newton 法。在阻尼 Newton 迭代中,增加参数 \(\alpha_k\):
其中参数 \(\alpha_k\) 使得不等式
成立。通常 \(\alpha_k\) 可以通过线搜索(line search)来确定,例如从 \(\alpha_k=1\) 开始,若不满足下降条件则不断减半,直到满足条件为止。
阻尼 Newton 法的意义
阻尼因子 \(\alpha_k\) 的作用是在 Newton 方向上寻找一个更保守的步长,避免"跨过"真实根导致发散。当接近根时,通常 \(\alpha_k\to1\),恢复标准 Newton 法的二阶收敛速度。
7 Aitken 加速¶
7.1 线性收敛序列的加速¶
设序列 \(x_k\to x^*\) 线性收敛,并近似满足
解这个关系可得对极限的加速估计:
这称为 Aitken \(\Delta^2\) 加速法。
7.2 适用条件¶
Aitken 法适合近似线性收敛的序列。如果分母
接近 0,则加速结果可能数值不稳定。
例 7.1:Aitken 加速
对线性收敛序列
有 \(a_k\to0\),且主导误差约为 \(2^{-k}\)。Aitken 加速可以显著消去主导线性误差项,使新序列更快靠近 0。
8 Steffensen 方法¶
8.1 从 Aitken 到 Steffensen¶
对不动点迭代 \(x_{k+1}=\phi(x_k)\),有
将 Aitken 加速直接写成只依赖当前点的迭代函数:
等价地,
于是 Steffensen 迭代为
8.2 特点¶
Steffensen 法不显式使用导数,却常能达到类似 Newton 法的二阶收敛效果。代价是每步通常需要计算两次 \(\phi\)。
例 8.1:Steffensen 加速
求
可写为不动点格式
初值取 \(x_0=0\)。普通迭代约十几步收敛到
Steffensen 加速后,只需少量迭代即可达到相近精度。
9 Ramanujan 迭代法¶
9.1 基本形式¶
Ramanujan 迭代法用于处理形如
的方程。构造级数
比较系数可得递推:
若极限
存在,则 \(c\) 对应方程中模最小的根。
9.2 例子¶
例 9.1:二次方程
对
有 \(a_1=1,\ a_2=2,\ a_n=0\ (n\geq3)\)。递推生成的比值
逐渐趋近于 \(0.5\),对应方程的模最小根。
例 9.2:超越方程
对
展开得
递推计算 \(b_n\) 后,比值 \(b_n/b_{n+1}\) 收敛到
这给出了该超越方程的一个根。
10 弦位法(割线法)¶
弦位法是一系列与 Newton 迭代法类似、但 不用计算函数导数 \(f'(x)\) 的算法。本节介绍两种弦位法:双点弦位法与单点弦位法。
10.1 双点弦位法¶
双点弦位法将函数的导数近似成差商:
代入 Newton 迭代格式,得到双点弦位法的迭代格式:
几何意义
双点弦位法用曲线在 \((x_{k-1},f(x_{k-1}))\) 与 \((x_k,f(x_k))\) 两点之间的 割线 与 \(x\) 轴的交点作为下一次近似,因此也称为 割线法。
例 10.1:双点弦位法求 \(f(x)=x^2-2\) 的正根
取初值 \(x_0=0.8,\ x_1=2\)。
第一次迭代:

第二次迭代:

算法¶
收敛性分析¶
定理 10.1(双点弦位法的收敛阶)
假设 \(f(x)\) 在某个根 \(x=x^*\) 的邻域内两次可导且 \(f'(x)\neq0\)。如果初值 \(x_0, x_1\) 足够接近 \(x^*\),则双点弦位法收敛至 \(x^*\),并且收敛阶为
即黄金分割比,且
证明
对于 \(x_{k-1}\) 与 \(x_k\),定义线性插值函数:
则有 \(s_k(x_k)=f(x_k)\),\(s_k(x_{k-1})=f(x_{k-1})\)。双点弦位法中 \(s_k(x_{k+1})=0\)。
考察 \(s_k(x)\) 与 \(f(x)\) 的误差项 \(f(x)-s_k(x)\)。构造辅助函数:
根据罗尔定理,存在 \(\eta\in(x_{k-1},t)\) 及 \(\zeta\in(t,x_k)\),使得 \(g'(\eta;t)=0\),\(g'(\zeta;t)=0\)。再次使用罗尔定理,存在 \(\xi_k\in(\eta,\zeta)\) 使得 \(g''(\xi_k;t)=0\),即
于是
考虑到 \(f(x^*)=0\),于是有
同时双点弦位法要求 \(s_k(x_{k+1})=0\),于是上式可改写成
根据微分中值定理,存在 \(\omega_k\) 使得
于是得到
根据收敛阶的定义,假设
比较上式的阶数,得到 \(p^2=p+1\),因此 \(p=\dfrac{1+\sqrt{5}}{2}\)。\(\square\)
10.2 单点弦位法¶
单点弦位法将 \(f'(x_k)\) 近似成
即始终固定一个端点 \(x_0\),迭代格式为
与双点弦位法的区别
双点弦位法每次迭代更新两个最近的点,而单点弦位法固定一个端点 \(x_0\) 不变,只更新另一个端点。这导致两者的收敛阶不同。
定理 10.2(单点弦位法的收敛阶)
假设 \(f(x)\) 在某个根 \(x=x^*\) 的邻域内两次可导且 \(f'(x)\neq0\)。如果初值 \(x_0, x_1\) 足够接近 \(x^*\),则单点弦位法收敛至 \(x^*\),并且收敛阶为 一阶 (\(p=1\)),且
证明
类似双点弦位法的证明,对于固定的 \(x_0\) 与 \(x_k\),定义线性插值函数:
重复证明过程,存在介于 \(x_0\) 与 \(x_k\) 的 \(\xi_k\),使得
考虑到 \(f(x^*)=0\) 以及单点弦位法要求 \(s_k(x_{k+1})=0\),于是有
根据微分中值定理,存在 \(\omega_k\) 使得
于是得到
由于 \(x_0-x^*\) 为常数(不趋于 0),比较阶数得到 \(p=1\)。\(\square\)
11 Müller 法(抛物线法)¶
弦位法采用当前两个近似解进行迭代。将这个思路推广,即采用当前 三个 近似解来确定下一个迭代近似解,这个方法就是 Müller 法,也称为 抛物线法。
11.1 方法思想¶
当前三个插值点记作 \((x_{k-2},f(x_{k-2}))\)、\((x_{k-1},f(x_{k-1}))\) 与 \((x_k,f(x_k))\)。一个简单直接的想法就是将这三个点插值得到 Lagrange 多项式 \(L_k(x)\),然后求解 \(L_k(x)=0\) 获得 \(x_{k+1}\)。
为了方便计算,将迭代格式记为
同样也就有
于是二次方程 \(L_k(x_{k+1})=0\) 可以整理成关于 \(\lambda_{k+1}\) 的二次方程:
其中
求解 \(L_k(\lambda_{k+1})=0\),并选取 绝对值较小 的 \(\lambda_{k+1}\)(保证收敛),更新 \(x_{k+1}\)。
两种 Müller 法
上述 Müller 法用 \(y=L_k(x)\) 形式的抛物线,不能保证实根的存在性。因此也可以通过构造形如 \(x=ay^2+by+c\) 的开口向 \(x\) 轴正(负)方向的抛物线来保证解的存在性。只要 \(f(x_{k-2}), f(x_{k-1}), f(x_k)\) 不全相等,就可以保证抛物线构造成功。
两种 Müller 法的收敛率都是 \(p\approx1.839\),介于双点弦位法(\(p\approx1.618\))和 Newton 法(\(p=2\))之间。
12 非线性方程组的 Newton 法¶
解单个非线性方程的方法可以进一步推广至求解非线性方程组
或者简写成向量形式
12.1 从极值问题到方程组¶
从多变量标量函数的极值问题
如果 \(\phi(\boldsymbol{x})\) 满足一定可导性,那么极值问题对应于找到驻点 \(\boldsymbol{x}\) 使得
这正是一个非线性方程组求零点的问题(注意极大值/极小值问题还需要判断 Hessian 的正定/负定性质)。
12.2 Newton 迭代格式¶
非线性方程组同样可以通过 Newton 迭代法求解。对 \(\boldsymbol{f}(\boldsymbol{x})\) 在点 \(\boldsymbol{x}^{(0)}\) 处做 Taylor 展开,并只保留线性部分:
其中 \(\boldsymbol{J}\) 为 Jacobi 矩阵:
令线性近似等于 \(\boldsymbol{0}\),得到线性方程组:
当 Jacobi 矩阵可逆时,解出 \(\Delta\boldsymbol{x}^{(0)}\),于是下一个迭代解更新为
一般地,非线性方程组的 Newton 迭代格式为
实际计算中不直接求逆矩阵,而是解线性方程组 \(\boldsymbol{J}(\boldsymbol{x}^{(k)})\Delta\boldsymbol{x}^{(k)}=-\boldsymbol{f}(\boldsymbol{x}^{(k)})\) 得到修正量 \(\Delta\boldsymbol{x}^{(k)}\)。
计算代价
每步 Newton 迭代需要:计算 \(n\) 个函数值、计算 \(n^2\) 个偏导数(或数值差分近似)、求解一个 \(n\times n\) 线性方程组。因此非线性方程组的 Newton 法计算量较大,但具有局部二阶收敛性。
13 拓展:Halley 迭代法¶
Edmund Halley(1656-1742)不仅以预测哈雷彗星轨道闻名,在数学上也有重要贡献。他在 1684 年提出了两种利用 二阶导数 获得高阶收敛率的迭代法。
13.1 第一种形式¶
令 Taylor 展开保留到二阶:
解这个关于 \(x_{k+1}\) 的二次方程,得到
分母上的 \(\pm\) 选择使分母绝对值更大的符号。
13.2 第二种形式(有理函数逼近)¶
定义有理函数
计算 \(a, b, c\) 使得 \(R(x)\) 与 \(f(x)\) 在 \(x_k\) 处具有相同的函数值和一阶、二阶导数值。利用 \(R(x)=0\) 的根 \(x=a\) 作为下一次近似,得到迭代格式:
Halley 法的收敛阶
Halley 迭代法利用了三阶信息(函数值、一阶导、二阶导),收敛阶可达 三阶 (立方收敛),但每步需要计算二阶导数,实际应用不如 Newton 法广泛。
14 拓展:快速平方根求解法(Quake III 中的 InvSqrt)¶
14.1 一段传奇代码¶
在 2003 年,论坛 gamedev.net 上出现了一段传奇代码:
float InvSqrt(float x) {
float xhalf = 0.5f * x;
int i = *(int*)&x;
i = 0x5f3759df - (i >> 1);
x = *(float*)&i;
x = x * (1.5f - xhalf * x * x);
return x;
}
这段代码计算的是 \(1/\sqrt{x}\),据称比标准库 (float)(1.0/sqrt(x))$ 快约 4 倍。代码中神秘的十六进制常数0x5f3759df` 引起了许多人的关注。
14.2 背后的 Newton 迭代¶
对于给定实数 \(x>0\),定义非线性函数:
于是 \(f(y)=0\) 的根即为 \(1/\sqrt{x}\)(正根)。Newton 迭代格式为
与代码中的
x = x * (1.5f - xhalf * x * x);
完全一致!
14.3 魔法常数的来源¶
这段代码的精髓在于:只进行了一次 Newton 迭代,但初始猜测值 0x5f3759df - (i >> 1) 极其精确。
利用 IEEE 754 单精度浮点数的存储格式:
其中 \(s\) 为符号位,\(E\) 为指数位,\(M\) 为尾数位。对于 \(x>0\),有 \(s=0\),即
于是
通过将浮点数 reinterpret 为整数、右移一位、再减去魔法常数,本质上是在对指数和尾数同时做近似,使得初始猜测的相对误差极小。随后一次 Newton 迭代即可将误差降到可接受范围。
工程智慧
这个例子展示了数值方法在实际工程中的巧妙应用:利用 IEEE 浮点数的位级表示来构造超精确的初始猜测,结合一次 Newton 迭代,实现了极快的平方根倒数计算。这种方法在图形渲染(如法线归一化)中被大量使用。
15 小结¶
不同求根方法的侧重点不同:
| 方法 | 优点 | 局限 | 收敛阶 |
|---|---|---|---|
| 二分法 | 稳定可靠、必收敛 | 需要异号区间,速度慢 | 线性(\(p=1\)) |
| 不动点迭代 | 形式简单,可分析性强 | 收敛依赖 \(\phi\) 的构造 | 通常线性 |
| 松弛法 | 易实现,可调节收敛 | 松弛因子选择敏感 | 通常线性 |
| Newton 法 | 局部二阶收敛,速度快 | 需要导数,对初值敏感 | \(p=2\)(单根) |
| 阻尼 Newton 法 | 扩大收敛域 | 每步需线搜索 | 接近根时 \(p\to2\) |
| 双点弦位法 | 不用导数,超线性收敛 | 需要两个初值 | \(p\approx1.618\) |
| 单点弦位法 | 不用导数,实现简单 | 收敛慢 | \(p=1\) |
| Müller 法 | 不用导数,收敛较快 | 需要三个初值,解二次方程 | \(p\approx1.839\) |
| 非线性方程组 Newton 法 | 局部二阶收敛 | 需 Jacobi 矩阵,计算量大 | \(p=2\) |
| Aitken 加速 | 加速线性收敛序列 | 分母小时不稳定 | — |
| Steffensen 法 | 不用导数,常具二阶效果 | 每步函数计算更多 | \(p=2\) |
| Ramanujan 法 | 可处理特定级数型方程 | 适用范围较特殊 | — |
| Halley 法 | 三阶收敛 | 需二阶导数 | \(p=3\) |
| 快速 InvSqrt | 极快,适合工程应用 | 精度有限 | 近似 \(p=2\)(一次迭代) |