预测子修正子法模拟器 返回
数值分析

预测子修正子法模拟器 — 海因法

常微分方程求解的两阶段数值积分法「海因法(预测子修正子法)」可视化工具。用欧拉法预测、梯形公式修正的机制,通过改变步长 h 和初值进行观察,实时了解相对欧拉法的误差改进率和与精确解的吻合度。

参数设置
测试方程
选择精确解已知的常微分方程
步长 h
每步进行的时间幅度
初值 y0
t=0 处 y 的初始值
计算时间 t_end
s
进行积分的总时间
计算结果
预测子修正子法的最终值
欧拉法的最终值
精确解的最终值
预测子修正子法的最大误差
欧拉法的最大误差
误差改进率 (%)
预测子·修正子的单步 — 解平面动画

标记沿精确解曲线每步前进。放大显示比较了欧拉预测子的斜率与预测点、梯形修正子(始端和预测终端斜率的平均)与修正点。

数值解 vs 精确解 y(t)
最大误差 vs 步长 h
理论·主要公式

$$\tilde y_{n+1}=y_n+h\,f(t_n,y_n)\quad(\text{预测子})$$

预测子是前进欧拉法。仅用始端 t_n 的斜率直线进行一步,得到终端的暂定值 ỹ。f 是右端函数,h 是步长。

$$y_{n+1}=y_n+\frac{h}{2}\big[f(t_n,y_n)+f(t_{n+1},\tilde y_{n+1})\big]\quad(\text{修正子})$$

修正子是梯形公式。用始端和预测终端斜率的平均值进行步进。这是海因法的核心。

$$\text{局部误差}=O(h^{3}),\qquad \text{全局误差}=O(h^{2})$$

海因法是2段2阶龙格库塔法(RK2),全局误差为 O(h²)。h 减半时误差约为原来的 1/4。

预测子修正子法概述

🙋
微分方程用计算机求解时,我先学了欧拉法。但「预测子修正子法」这个名字,好像有两个步骤?具体在做什么呢?
🎓
就如名字所言,「预测然后修正」两个步骤。先用简单的公式大概猜下一个点(预测子),再用更精确的公式重新计算(修正子)。海因法是代表,预测用欧拉法,修正用梯形公式。只需两步,精度就能从欧拉法的1阶提升到更高阶!
🙋
欧拉法是「用现在位置的斜率直线进行」,对吧。它不好的地方在哪呢?
🎓
问得好。问题是区间中间斜率会变化。比如 y'=-2y,解呈曲线衰减,如果只用始端斜率直线进行,步终点处总是和实际位置有偏差。衰减的话每次都偏下去,这样误差就系统性地积累。要消除误差就得缩小步长。
🙋
那用梯形公式就能解决「中间斜率变化」的问题?
🎓
正是。梯形公式用始端和终端两个斜率的平均值来进行,这样既看入口又看出口,能对中间的斜率变化进行1阶补正。但麻烦的是,要知道终端斜率就得知道终端值——这还没算出来。所以「预测子」登场,先用欧拉法粗估终端,用这个预测值计算终端斜率。预测→修正,就是海因法的全景。
🙋
每步要计算函数 f 两次,工作量增加了。这样真的划算吗?
🎓
很划算。欧拉法1阶精度,误差正比于 h。海因法2阶精度,误差正比于 h²。所以 h 减半时,欧拉法误差减半,海因法误差减为四分之一。上面「最大误差 vs 步长 h」的图,你能看到海因法的线下降得更陡峭。虽然计算次数翻倍,但用更大的 h 就能达到相同精度,总计算量往往反而更少。
🙋
预测子修正子法有很多种吗?海因法以外还有其他的?
🎓
有的。海因法是「仅用当前步的信息」完成的单步法,但在做大规模计算时,「亚当斯-巴什福斯/亚当斯-莫尔顿」的组合更常用——预测子用显式亚当斯-巴什福斯,修正子用隐式亚当斯-莫尔顿。思想和海因法完全一样都是「先预测再修正」。所以掌握海因法,再学高阶预测子修正子法会很顺畅。

常见问题

预测子修正子法是一种两阶段数值积分法,先用简单的公式「预测」下一步的值,再用精度更高的公式「修正」。海因法是其代表,预测子采用前进欧拉法 ỹ = y + h·f(t,y),修正子采用梯形公式 y_new = y + (h/2)·[f(t,y) + f(t+h, ỹ)]。通过平均区间始端和预测终端的斜率,将欧拉法的1阶精度提升至2阶精度(全局误差 O(h²))。
前进欧拉法为1阶精度,全局误差为 O(h)。海因法为2阶精度,全局误差为 O(h²),因此将步长 h 减半时,欧拉法误差减半,海因法误差减为四分之一。例如求解 y'=-2y,当 h=0.2 时,海因法的最大误差仅为欧拉法的几十分之一。虽然每步需要计算两次函数 f,但可用更大的 h 达到相同精度,总计算量反而较少。
前进欧拉法仅用区间始端 t_n 的斜率 f(t_n,y_n) 直线进行,当斜率在区间内变化时会系统性偏离。梯形公式使用始端斜率 f(t_n,y_n) 和终端斜率 f(t_{n+1},ỹ) 的平均值,能对区间内的斜率变化进行1阶补正。因为终端值未知,先用预测子(欧拉法)估计 ỹ,再代入终端斜率计算,这正是海因法的核心。这也可视为对梯形公式的一次迭代。
是的,海因法属于显式2段2阶龙格库塔法(RK2)的一种。RK2 因系数取法不同有多个变种,海因法是始端和预测终端斜率用等权重 1/2 平均的「梯形型RK2」。中点法(用区间中点斜率的RK2)也是2阶精度,但斜率评估点不同。两者都有局部截断误差 O(h³)、全局误差 O(h²),是欧拉法(RK1)和RK4之间的折中方法。

实际应用

控制系统·机器人实时模拟:无人机或工业机器人的运动方程在微控制器上进行时间积分时,欧拉法精度不足,RK4 单步计算量过重。海因法用两次函数计算就获得2阶精度,在有限计算资源下能很好平衡「足够精确·足够轻量」,适合实时控制。在模型预测控制(MPC)的内部积分器中也经常应用。

分子动力学·粒子模拟:多粒子运动求解的分子动力学中,速度-韦莱法或预测子修正子型积分器是标准配置。先预测位置、再用新斜率修正速度的流程,与本工具的海因法完全相同结构。在保持能量守恒并允许较大时间步长时,预测子修正子框架非常实用。

电路模拟·瞬态分析:SPICE 型电路模拟器以梯形法(与海因法修正子相同公式)的隐式形式为标准,但用欧拉法的预测值作为初始估计,能减少牛顿反复次数。预测子修正子法在隐式求解器的良好初值供给中也发挥作用。

数值分析教学和算法验证:海因法是「从欧拉法到高阶法的第一步」,必定出现在数值分析讲义中。如本工具所示,改变步长 h 观察误差按 h² 减少这一抽象概念,能让人亲身体验。新开发的积分求解器实现后,与已知解对比时检查 h 的收敛阶数是否为2,这个验证方法在实务中广泛应用。

常见误解和注意事项

最大的误解是「2阶精度所以步长 h 可以任意大」这种想法。精度阶数高与数值稳定是两回事。海因法也有有限的绝对稳定域,在衰减快(刚性强)的问题中如果 h 过大,即使2阶精度,数值解也会振荡、发散。实际上本工具中 y'=-2y 的 h=1.0 时误差会急剧增大。h 需要同时考虑「精度要求」和「在稳定域内」两个因素。

其次,「修正子多反复几次就能提高精度」的想法也要避免。海因法是预测1次、修正1次后完成的「PEC(预测·评估·修正)」型。修正子再多迭代,得到的只是梯形法本身的解,精度阶数仍是2,不会升高。迭代能在某种程度改善稳定性,但函数计算次数增加而阶数不变,这样得不偿失。如要3阶、4阶精度,应转换到 RK3·RK4 等其他方法。

最后要注意的是「预测子精度随意,只要修正子精度高就行」的想法。虽然海因法整体上预测子用1阶欧拉法也能最终达到2阶精度,但这是预测子和修正子的阶数恰好匹配的结果。高阶预测子修正子法(如亚当斯系列)中,预测子和修正子的阶数必须对齐,否则修正子的高阶精度无法充分发挥。自己组合预测子修正子法时一定要检查两者的阶数是否协调。

使用指南

  1. 将步长 h 设置在 0.001~0.1 范围内,调查海因法的积分精度
  2. 从 -5~5 范围选择初值 y0,确定常微分方程 dy/dt=f(t,y) 的初始条件
  3. 指定积分终止时刻 tEnd 在 0.1~10 范围内,同时计算预测子修正子法和欧拉法
  4. 运行模拟后,确认最终值、最大误差、误差改进率,可视化手法的收敛特性

具体计算示例

微分方程 dy/dt=-2y+t,初值 y0=1.0,步长 h=0.01,终止时刻 tEnd=2.0 的情况:海因法预测步计算 y*=yn+h×f(tn,yn),修正步通过 yn+1=(yn+y*)/2+h×f(tn+h,y*)/2 削减误差。结果为海因法 y(2.0)≈0.0536,欧拉法 y(2.0)≈0.0421,精确解 y(2.0)≈0.0541,最大误差分别为海因法 0.00049 和欧拉法 0.012,误差改进率达到约 96%。

实务中的注意点

  1. 海因法为2阶精度,因此步长减半时局部误差降为四分之一。精密机械设计的动特性解析建议 h≤0.001
  2. 化学反应速率式 dy/dt=k×exp(-E/RT)×y 等含指数函数的硬方程中,海因法即使设置 h 也可能在 h≤0.0001 以下时才能控制误差积累
  3. 结构振动分析处理过阻尼系统(阻尼比 ζ>0.8)时,将步长设为时间常数的 1/100 以下可确保稳定性
  4. 当模拟结果与实测值偏差超过 5% 时,应重新考虑模型中的非线性项或参数辨识