第 9 章 · 求根与非线性方程组
解 $f(x)=0$:一维有一维的讲究,多维是多维的战场。这一章的核心判断是——导数可得吗、初值有好坏,两个答案组合出不同武器。
一维:三种基本武器
- 二分法:区间夹逼,每次缩半,必然收敛但线性慢(每步 1 bit)。永远稳妥的保底。
- 割线法/假位法:不用导数,用两点连线作零点估计,超线性收敛。Brent 方法 = 二分兜底 + 割线/逆插加速,一维求根的默认答案(保证收敛且通常快)。
- 牛顿法:$x_{n+1} = x_n - f(x_n)/f'(x_n)$,二次收敛,但需要导数且初值不好时可能发散或跳根。初值可靠时最快。
组合哲学:快法冲刺 + 稳法兜底,这就是 Brent 的配方,也是所有稳健求根库的设计。
多维:牛顿家族与无导数方法
$n$ 个方程 $n$ 个未知数 $\mathbf{F}(\mathbf{x})=0$:
- 牛顿-拉夫森:$\mathbf{x}_{n+1} = \mathbf{x}_n - J^{-1}\mathbf{F}$,二次收敛;代价:算雅可比 $J$ + 解线性方程,初值敏感。
- Broyden 拟牛顿:用历次 $\mathbf{F}$ 值低秩更新近似 $J$,免解析导数,收敛超线性。
- 全局化:纯牛顿常被"步子太大"害死,加线搜索(步长缩放保证 $\|\mathbf{F}\|$ 下降)或信赖域(限制步长范围)后成为工程标准。
多项式求根的特例
多项式根的求法自成一派:特征值法(伴随矩阵的特征值,LAPACK 路线)一步到位;Aberth/Jenkins-Traub 同时收敛所有根。注意:重根附近条件数极差($k$ 重根的精度损失 $\sim \sqrt[k]{\epsilon}$),报告根的精度要看根的重数。
老师的提醒
- 求根之前先画函数或粗扫变号区间——90% 的"牛顿不收敛"是初值在另一个根的吸引域里。
- 物理问题多解时(如能量方程多分支),明确你要哪个根:给区间约束比调初值靠谱。
自检
- Brent 方法怎么同时做到"保证收敛"和"通常很快"?
- 全局化牛顿的两个常用手段?
- 重根为什么毁精度?
更深一层:求根算法的"收敛保证谱系"
求根方法可以按"收敛保证 vs 收敛速度"排成一条光谱:二分法(保证收敛、线性慢,每步 1 bit 精度)→ 假位法(保证但可能一端僵滞)→ 割线法(超线性 1.618,无保证)→ 牛顿法(二次,需导数与好初值)。Brent 方法的智慧是"组合票据":二分的保险 + 逆二次插值/割线的速度,在每次迭代中优先用快法、失速就退回二分——保证收敛且通常超线性。它成为一维求根的默认答案不是因为它最快,而是因为它的最坏情况不坏——工程算法的美德排序里,"下限高"经常压过"上限高"。
初值问题值得再强调:牛顿法的收敛域是分形的(牛顿分形图)——同一初值附近微调,可能落到不同根或发散。多根物理问题的正确姿势:先扫描变号区间(画图或粗网格符号变化检测),再逐区间用 Brent,最后用"根的重数"评估精度($k$ 重根只有 $\epsilon^{1/k}$ 级精度)。
推导细读:全局化牛顿的两道保险
多维牛顿 $\mathbf{x}_{+} = \mathbf{x} - J^{-1}\mathbf{F}$ 的两大死法:初值远(线性化模型完全失真)与病态雅可比(方向算错)。线搜索:沿牛顿方向做一维搜索保证 $\|\mathbf{F}\|$ 下降——但纯下降会困在局部平坦区,现代实现用 merit function + 拒绝小步的混合策略;信赖域:每步限制 $\|\Delta x\| \le \Delta$,按模型预测 vs 实际下降的比值动态调 $\Delta$——预测准就放开、预测差就收紧。MINPACK 的 hybrd(scipy.fsolve 内核)= 拟牛顿 Broyden + 信赖域 + Powell 混合技巧,是"无导数稳健求根"的工业答案。使用纪律:给 fsolve 配好初值猜测与 xtol/ftol,把它的诊断输出(ier)读出来而不是只拿解。
在真实世界里:非线性方程组的"物理化简"优先
工程方程组动手数值求解前,先做物理化简常能降维打击:利用对称性砍掉一半未知数;用守恒量消元(能量/动量先解出部分变量);尺度归一化让雅可比各分量同量级(改善条件数)。一个实例:化工平衡方程组直接解不收敛,把方程组无量纲化 + 取对数变量(浓度 $x \to \ln x$ 保证正性)后一次收敛——变量变换是免费的正则化。这些手法不改变解,只改变数值问题的"地形",让牛顿法看得见路。
专题深入:Brent 方法的"组合票据"哲学
Brent 方法的智慧值得单独品味:二分的保险 + 逆二次插值/割线的速度——每次迭代优先用快法、失速就退回二分,保证收敛且通常超线性。它成为一维求根的默认答案不是因为它最快,而是因为它的最坏情况不坏——工程算法的美德排序里,"下限高"经常压过"上限高"。这个"组合票据"哲学在现代算法里反复出现:MINPACK 的 hybrd(拟牛顿 + 信赖域 + Powell 混合)是同款的"稳健性组合"。
初值的物理学:多根物理问题(能量方程多分支)的初值选择由物理意义决定——你要哪个根,初值就要进哪个吸引域。牛顿分形图(同一初值附近微调落到不同根)是"初值敏感性"的可视化警告。
数学细节展开:全局化牛顿的"两道保险"
多维牛顿的两道保险值得展开:线搜索(沿牛顿方向保证 $\|\mathbf{F}\|$ 下降——但纯下降会困在局部平坦区,现代实现用 merit function + 拒绝小步)与信赖域(每步限制 $\|\Delta x\| \le \Delta$,按模型预测 vs 实际下降的比值动态调——预测准就放开、预测差就收紧)。两道保险的组合(MINPACK 的 hybrd)是"无导数稳健求根"的工业答案。纯牛顿常被"步子太大"害死——全局化是牛顿法从教科书走向工程的必经之路。
工程案例细节:非线性方程组的"物理化简"优先
工程方程组动手数值求解前的物理化简值得做成清单:对称性砍掉一半未知数;守恒量消元(能量/动量先解出部分变量);尺度归一化让雅可比各分量同量级(改善条件数);变量变换(浓度 $x \to \ln x$ 保证正性——化工平衡的收敛救赎)。变量变换是免费的正则化——这些手法不改变解,只改变数值问题的"地形",让牛顿法看得见路。
常见误区与辨析(补充)
- "牛顿法不收敛就换方法":先检查初值与雅可比的正确性——90% 的不收敛是这两处的问题。
- "重根没办法":重根附近条件数极差($k$ 重根的精度损失 $\sim\sqrt[k]{\epsilon}$)——报告根的精度要看根的重数,或用病态修正。
例题
用牛顿法解 $f(x) = x^2 - 2 = 0$,从 $x_0 = 1$ 迭代三步,观察收敛速度。
解答
迭代式 $x_{n+1} = x_n - \frac{x_n^2-2}{2x_n} = \frac{x_n}{2} + \frac{1}{x_n}$:
真值 $\sqrt2 = 1.41421$。误差序列:$0.0858 \to 2.45\times10^{-3} \to 8.6\times10^{-6} \to$ 下一步 $\sim 2.6\times10^{-11}$。
二次收敛:误差大致平方递减(有效数字每次翻倍)——这就是牛顿法"贵在导数、快在收敛"的体感。