皮卡尔迭代(不动点迭代)模拟器 返回
数值分析

皮卡尔迭代(不动点迭代)模拟器

将方程改写为 x = g(x) 的形式,然后重复执行 x_{n+1} = g(x_n)「不动点迭代」的可视化工具。通过改变映射函数 g(x)、初值、迭代次数,您可以直观地看到蛛网图(cobweb)如何收敛到不动点或发散,以及收敛条件 |g'(x*)|<1 的真实含义。

参数设置
不动点映射 g(x)
x = g(x) 的右边。迭代公式为 x_{n+1}=g(x_n)
初值 x0
开始迭代的初始值
最大迭代次数
即使收敛也在此次数后停止
计算结果
不动点 x*
迭代后的值 x_n
收敛系数 |g'(x*)|
实际迭代次数
收敛 / 发散
最终误差 |Δx|
蛛网图(Cobweb)— 迭代轨迹

绘制曲线 y=g(x) 和直线 y=x,从 x0 开始反复做「到曲线垂直、再到直线 y=x 水平」的运动。轨迹如果螺旋进入交点则收敛,外翻则发散。

迭代值收敛 — x_n 与迭代次数 n
误差推移 — |x_n − x*|(对数尺度)
理论·主要公式

$$x_{n+1}=g(x_n),\qquad x^{*}=g(x^{*})$$

不动点迭代的递推公式。不动点 x* 是在映射 g 下保持不变的点,对应图像 y=g(x) 与直线 y=x 的交点。

$$|g'(x^{*})|<1$$

局部收敛条件(压缩映射条件)。当不动点处 g 的导数绝对值小于 1 时,迭代会收敛到 x*。超过 1 则 x* 成为反发点而导致发散。

$$e_{n+1}\approx g'(x^{*})\,e_{n},\qquad e_n=x_n-x^{*}$$

误差每一步约缩小为系数 |g'(x*)| 倍(线性收敛)。|g'(x*)| 越小,收敛越快。

皮卡尔迭代(不动点迭代)是什么

🙋
「不动点迭代」就是重复同一个计算,就能解方程?听起来很神奇啊。
🎓
基本上是真的。诀窍是把方程改写成「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)| 本身,区分「迭代次数上限」和「真正收敛」。本工具显示最终误差和实际迭代次数,可以体会两者的区别。

使用指南

  1. 在映射函数 g(x) 下拉框中选择映射。可选:g(x) = cos(x)、g(x)=(x+2/x)/2、g(x)=e^(-x)、g(x)=2x−1(发散例)
  2. 在 x0Num 设置初值,在 itNum 设置迭代次数(通常 10~50 次)
  3. 点击「计算」按钮(参数改动自动触发),蛛网图绘制 x_{n+1} = g(x_n) 的迭代轨迹
  4. 查看不动点 x* 和收敛系数 |g'(x*)|,判断:|g'(x*)| < 1 则收敛,> 1 则发散

具体计算例

热交换器温度平衡问题:出口温度满足 T = g(T) = 0.8T + 12(g'(T) = 0.8),初值 T₀ = 20°C 开始迭代。不动点为 T* = 0.8T* + 12,解得 T* = 60°C。收敛系数 |g'(60)| = 0.8 < 1,故迭代收敛。20 次迭代后 T₂₀ ≈ 59.998°C,最终误差 |ΔT| ≈ 0.002°C。

工程实务注意

  1. 结构力学非线性方程(如索梁挠度计算)中初值选择很关键。应从物理合理范围(如跨度的 ±20%)开始
  2. 流体压力修正迭代中 |g'(x*)| ≈ 0.3~0.5 为最优。超过 0.9 收敛极慢,计算成本大增
  3. 数值稳定性要求:迭代次数限制在 100 次以内,以 |Δx| < 10⁻⁶ 作为收敛判断,防止陷阱