🙋
「不动点迭代」就是重复同一个计算,就能解方程?听起来很神奇啊。
🎓
基本上是真的。诀窍是把方程改写成「x = g(x)」这种形式。比如,要解 cos(x) = x,这个式子本身就是那个形式。只需输入一个初值 x0 到计算器,按 cos 键一直按下去。从 x0=1 开始,值会逐渐落在 0.739… 附近。这个稳定下来的数就是「不动点」,也就是映射 g 不移动的点。
🙋
我试过在计算器上一直按 cos,最后数确实不动了!那是解啊。不过,是不是所有方程都能这样解?
🎓
这就是关键问题,并不总是收敛。决定性的因素是不动点处映射函数的导数,|g'(x*)|。当这个值小于 1 时,g 就变成「压缩映射」,反复作用会缩小距离,误差不断缩小趋向 x*。反之,超过 1 的话,每一步都被弹开,越来越远,发散了。左边菜单试试『g(x)=2x−1』。它的导数恒为 2,所以除了初值正好是 1,否则一定吹飞。
🙋
真的,发散了,显示「发散」。那即使收敛,也有快慢之分吗?
🎓
有的。不动点迭代叫「线性收敛」,误差每一步约缩小为 |g'(x*)| 倍。所以 |g'| 越小越快。cos 的例子,不动点处 |g'|≈0.67,误差每次缩到三分之二,还可以。但如果 |g'| 是 0.95,那每次只减少 5%,几十步都看不到效果。看下面的误差图,用对数尺度,收敛的情形下误差呈直线下降,斜率就是 log|g'|。
🙋
我选『g(x)=(x+2/x)/2』试试,才几次迭代就完全收敛到 √2 了!怎么这么快?
🎓
好眼光。那个其实是巴比伦法(在 x²−2=0 用牛顿法的结果)。这个 g 在不动点 √2 处的导数是 0。线性收敛系数为零,实际上变成了「二阶收敛」——误差每次平方一样缩小。所以三四次就够了。同样的方程 x²=2,写成 x=2/x 会发散,写成 x=(x+2/x)/2 就超级快。改写方式的力量太大了。
皮卡尔迭代是一种数值解法,将方程改写为 x = g(x) 的形式,从某个初值 x0 开始,重复执行 x_{n+1} = g(x_n) 逼近解(不动点)。不动点 x* 是满足 g(x*) = x* 的点,即图像 y=g(x) 与直线 y=x 的交点。例如,用 g(x)=cos(x),从 x0=1 开始迭代,值会逐渐收敛到 Dottie 常数 x*≈0.739085。实现极其简单,是牛顿法等许多迭代解法的基础。
局部收敛条件是 |g'(x*)| < 1。在不动点 x* 附近,如果映射函数 g 的导数绝对值小于 1,则 g 是「压缩映射」,迭代会缩小误差并收敛到 x*。反之,若 |g'(x*)| > 1,则 x* 是反发点,即使初值再接近也会发散。本工具的『g(x)=2x−1』中 |g'|=2>1,故当 x0≠1 时必然发散。|g'(x*)|=1 为中立情况,收敛性取决于高阶项。
不动点迭代为线性收敛,误差 e_n = x_n − x* 每一步约缩小为系数 |g'(x*)| 倍。即 |g'(x*)| 越小,收敛越快。例如 |g'|=0.5 时误差每步减半;|g'|=0.95 时每步仅减少 5%,收敛极其缓慢。观察本工具的误差图(对数尺度),收敛情形下误差呈近似直线下降,其斜率对应 log|g'(x*)|。
发散源于不动点处 |g'(x*)| ≥ 1。对策是改写同一方程,换用不同的 g(x)。例如求解 x²=2 时,用 x=2/x(|g'|=2 发散)不行,但改成 x=(x+2/x)/2(在 √2 处 |g'|=0,超高速收敛)就可以。也可使用逆映射 x=g⁻¹(x),或加入松弛系数 ω:x_{n+1}=(1−ω)x_n+ω·g(x_n)。
非线性方程求解:不动点迭代是求解无法用解析方法解的非线性方程 f(x)=0 的最基本工具。只需将 f(x)=0 改写为 x=g(x),重复迭代即可,极易在表格软件或小型单片机上实现。牛顿法 x_{n+1}=x_n−f(x_n)/f'(x_n) 本质上也是一种特殊的不动点迭代 g(x)=x−f(x)/f'(x)。
CAE·联立方程迭代解法:有限元法和有限体积法的非线性分析中,每个时间步或荷载步都要解很大的联立方程组。Jacobi 法、Gauss-Seidel 法、SOR 法等迭代法,本质都是矩阵形式的不动点迭代 x_{n+1}=Mx_n+c。收敛条件「迭代矩阵 M 的谱半径 < 1」是本工具 |g'(x*)|<1 在多维的推广。
流体·传热耦合分析:压力-速度交替求解的 SIMPLE 法,流体与结构的耦合(FSI)分析,辐射与传导耦合等都用不动点迭代:固定一方求解另一方,反复交替。松弛系数(欠松弛)x_{n+1}=(1−ω)x_n+ω·g(x_n) 是一种常见手法,通过降低实际 |g'| 防止发散。
常微分方程与皮卡尔存在定理:「皮卡尔迭代」这个名字源自用来证明常微分方程 dy/dx=f(x,y) 解的存在唯一性的皮卡尔逐次近似法。将积分方程 y(x)=y0+∫f(t,y(t))dt 看作映射,通过迭代生成函数列趋向解。Banach 不动点定理(压缩映射原理)是收敛的数学基础。
一个常见错误是认为「同一方程改写为 x=g(x) 的方法只有一种」。实际上改写方式有无穷多种,是否收敛、多快收敛完全取决于 g(x) 的选择。本工具的 x²=2 就是典型:x=2/x 时不动点处 |g'|=2,发散;x=(x+2/x)/2 时 |g'|=0,二阶收敛。看起来发散的问题,改写 g 后往往就救了。
另一个误解是「收敛条件由初值决定」。实际上 |g'(x*)|<1 是不动点 x* 的性质,与初值无关。x* 是反发点(|g'|>1)时,无论初值多接近都会发散。反过来若 x* 是吸引点(|g'|<1),在足够近的初值下必然收敛。初值的作用是「有多个不动点时,落向哪一个」或「从收敛域外出发而发散」,这是另一回事。
最后,「迭代停止 = 准确收敛到解」的陷阱。满足打切条件 |x_{n+1}−x_n|<ε 只说明「步长变小了」,不等于离真解近。当收敛极慢(|g'| 接近 1)时,可能还离解很远,但步长已经很小,就判成假收敛了。实务中应同时检查残差 |f(x)| 本身,区分「迭代次数上限」和「真正收敛」。本工具显示最终误差和实际迭代次数,可以体会两者的区别。