4. 步长与误差的定量关系

在自适应步长积分中,最核心的问题不是“要不要调步长”,而是“步长改变后,局部误差会按什么规律变化”。只有把这种定量关系搞清楚,步长调整才有依据,而不是凭经验拍脑袋。本节从局部截断误差的定义出发,推导步长变化对误差的影响阶数,并给出步长调整的基本公式。

局部截断误差与步长的幂次关系

考虑一阶常微分方程初值问题 y' = f(t, y),y(t₀) = y₀。设某一步从 tₙ 出发,步长为 h,数值方法给出近似值 yₙ₊₁。所谓局部截断误差,是指假设 yₙ 恰好等于精确解 y(tₙ) 时,经过一步计算后近似值与精确解之差:

τₙ₊₁ = y(tₙ₊₁) − yₙ₊₁

对 p 阶方法,局部截断误差的主项可以写成:

τₙ₊₁ = C · hp+1 · y(p+1)(ξ) + O(hp+2)

其中 C 是与方法有关的常数,ξ 位于区间 [tₙ, tₙ₊₁] 内。这个表达式说明:局部截断误差的主项与 hp+1 成正比。注意这里的阶数是 p+1,而不是 p——p 阶方法指的是全局误差为 O(hp),而单步的局部误差比全局误差高一阶。

以经典的四阶 Runge–Kutta 方法(RK4)为例,p = 4,局部截断误差主项为 O(h⁵)。若步长从 h 缩小为 h/2,局部误差主项将缩小为原来的 (1/2)⁵ = 1/32。这个“五次方”的衰减速度,正是高阶方法在步长控制上具有优势的根本原因。

从局部误差到步长调整公式

实际计算中,我们无法直接知道精确解,因此不能直接算出 τₙ₊₁。但可以利用“误差主项与 hp+1 成正比”这一结构,通过两次不同步长的计算结果来估计误差,并反推合适的步长。

设当前步长 h 产生的局部误差估计为 E(h),目标误差容限为 Tol。由于 E(h) ≈ C·hp+1,若希望新步长 h_new 满足 E(h_new) ≈ Tol,则有:

Tol / E(h) ≈ (h_new / h)p+1

两边取 1/(p+1) 次方,得到步长调整的基本依据:

h_new = h · (Tol / E(h))1/(p+1)

这个公式就是自适应步长控制的核心。它告诉我们:步长应按误差比值的 1/(p+1) 次幂缩放。对 RK4,指数为 1/5;对二阶方法,指数为 1/3。阶数越高,同样的误差超标程度只需要更温和的步长缩减,因为高阶方法的误差对步长更敏感。

工程实现中通常引入安全因子(如 0.9)和上下限裁剪,避免步长剧烈振荡:h_new = h · min(5, max(0.2, 0.9·(Tol/E)1/(p+1)))。安全因子让实际误差略低于容限,留出余量。

误差估计的实用途径:步长加倍法

要使用上面的公式,必须先得到 E(h)。一种经典且直观的做法是步长加倍法(也称 Richardson 外推思想):用步长 h 走一步得到 y(h),再用两个 h/2 走两步得到 y(h/2)。对 p 阶方法,两者之差与局部误差同阶:

E(h) ≈ |y(h/2) − y(h)| / (2p − 1)

以 RK4 为例,分母为 2⁴ − 1 = 15。这个估计值代入步长调整公式,就能在每一步动态决定下一步该用多大步长。实际的自适应 RK 方法(如 RKF45、Dormand–Prince)采用嵌入式一对高低阶公式,用同一组函数值同时得到两个不同阶的解,其差值直接作为误差估计,效率更高,但背后的定量依据仍然是“误差主项 ∝ hp+1”。

步长变化对局部误差的影响(以 RK4 为例,p=4) 步长 h(对数尺度) 局部误差 E(h) 10⁻⁶ 10⁻⁵ 10⁻⁴ 10⁻³ 10⁻² h/8 h/4 h/2 h 2h 斜率 = p+1 = 5 E ∝ h⁵ 目标容限 Tol 满足容限的步长 h* 步长减半 → 误差缩小 2⁵ = 32 倍 步长加倍 → 误差放大 32 倍 调整指数 1/(p+1) = 1/5

阶数差异带来的实际影响

把不同阶方法的误差-步长关系放在一起对比,能更直观地理解“阶数”在步长控制中的意义。下表给出几种常见方法在步长减半时局部误差的缩小倍数(按主项估算):

方法阶数 p局部误差主项步长减半时误差缩小倍数调整指数 1/(p+1)
显式 Euler1O(h²)41/2
中点法2O(h³)81/3
经典 RK44O(h⁵)321/5
Dormand–Prince 5(4)5O(h⁶)641/6

从表中可以看出,低阶方法对步长变化“不敏感”,误差随步长缩小下降得慢;高阶方法则“敏感”,步长稍一缩小误差就迅速下降。这带来两个实践结论:其一,高阶方法在光滑问题上可以用大步长达到高精度,效率优势明显;其二,高阶方法的步长调整指数更小,同样的误差超标只需更小的步长缩减比例,步长变化更平缓,数值稳定性更好。

建立步长调整的基本依据

综合以上推导,自适应步长调整的逻辑可以归纳为三步:

  1. 估计当前步的局部误差 E(h),可用步长加倍法或嵌入式方法得到;
  2. 按幂次关系反推目标步长:h_new = h · (Tol / E(h))1/(p+1);
  3. 施加安全因子与裁剪,防止步长振荡或突变,再进入下一步计算。

需要强调的是,这个公式成立的前提是误差主项确实由 hp+1 主导,即步长处于方法的渐近收敛区。如果步长过大,高阶项不可忽略,甚至方法本身失稳,公式给出的预测就会失真。因此实际算法中还要结合稳定性限制(如对刚性问题的稳定性边界)对步长设上限。此外,误差容限 Tol 通常按绝对容限与相对容限组合设定:Tol = Atol + Rtol·|y|,以兼顾大分量和小分量的精度需求。

常见误区:把“p 阶方法的局部误差是 O(hp)”当成结论。正确关系是局部误差 O(hp+1)、全局误差 O(hp)。步长调整公式中的指数必须用 1/(p+1),用错会导致步长预测系统性偏大或偏小。

至此,我们已经建立了“误差估计 → 幂次反推 → 安全裁剪”的定量链条。它把“步长该调多少”从经验判断变成了可计算的公式,为后续自适应算法的具体实现(如步长接受/拒绝判据、初始步长选取、连续多步的平滑控制)提供了直接依据。