3. 局部误差与全局误差

在自适应步长积分中,我们真正想控制的并不是“每一步走多大”,而是“最终解有多准”。但最终解的误差无法直接测量,因为它依赖于未知的精确解。于是数值方法退而求其次:用局部截断误差来估计每一步引入的误差,再通过步长调整把它压到容差之下。理解局部误差与全局误差的定义、量级关系和传播方式,是理解自适应步长为何有效、以及为何有时会失效的关键。

一、局部截断误差:单步的“先天缺陷”

局部截断误差(Local Truncation Error, LTE)的定义是:假设在第 n 步的起点处数值解恰好等于精确解,即 yn = y(tn),然后用数值方法走一步到 tn+1,所得结果与精确解 y(tn+1) 之差。它衡量的是“单步公式本身”的近似能力,与之前累积的历史误差无关。

对 p 阶方法,局部截断误差的主项为:

LTE = C · h^(p+1) · y^(p+1)(ξ) + O(h^(p+2))

其中 h 是步长,C 是与方法相关的常数,y(p+1) 是解的第 p+1 阶导数。注意指数是 p+1:四阶 Runge–Kutta 方法的单步局部误差是 O(h5)。这解释了为什么减小步长对局部精度极为“划算”——步长减半,局部误差约降为 1/32。

实际计算中我们无法得到 y(p+1),因此常用嵌入法(如 RKF45、Dormand–Prince)同时算出 p 阶和 p+1 阶两个解,用两者之差作为局部误差的估计量。这个差值不是真实 LTE,而是它的可控代理,这正是自适应步长的“眼睛”。

二、全局误差:所有单步误差的累积与放大

全局误差(Global Error)定义为:在终点 tN 处,数值解 yN 与精确解 y(tN) 之差。它包含了从第一步到最后一步所有局部误差的累积,并且这些误差还会被微分方程自身的动力学放大或衰减。

一个经典结论是:若每步局部误差为 O(hp+1),共走 N ≈ T/h 步,则全局误差为 O(hp)。也就是说,全局误差的阶比局部误差低一阶。四阶 RK 方法局部误差 O(h5),全局误差却是 O(h4)。步长减半,全局误差约降为 1/16,而不是 1/32。

更精细地看,误差传播受方程右端函数 f 的 Lipschitz 常数 L 影响。粗略地有:

|全局误差| ≤ (e^(L·T) − 1) / L · max|LTE| / h

当 L > 0(如刚性方程、不稳定系统)时,指数因子 eLT 会把早期的小误差急剧放大。这就是“局部误差小”不等于“全局误差小”的根本原因:误差不仅会累积,还会被系统动力学放大。

单步视角:局部截断误差 LTE 起点 yₙ = y(tₙ) (假设无历史误差) 走一步 h 数值解 yₙ₊₁ 与精确解 y(tₙ₊₁) 之差 LTE ≈ C·h^(p+1) 四阶RK:O(h⁵) 嵌入法估计 两解之差 N ≈ T/h 步累积 全局误差 ≈ O(h^p) 阶比局部误差低一阶(四阶RK:O(h⁴)) 动力学放大因子 e^(L·T) L 大(刚性/不稳定)→ 误差被放大 自适应步长控制回路 当前步长 h 与容差 tol 估计 LTE 与 tol 比较 调整 h h ← h·(tol/LTE)^(1/(p+1)) 接受/拒绝 进入下一步 反馈:用局部误差估计驱动步长,间接约束全局误差

三、两者关系:为什么控制局部误差能约束全局误差

从上面的关系可以看出三点:

  • 量级关系:全局误差 ≈ 局部误差 / h 再乘以放大因子。因此把每步局部误差控制在 tol 附近,全局误差大致被约束在 tol·T/h 的量级(在 L 较小时)。
  • 阶的关系:局部误差 O(hp+1) 决定了全局误差 O(hp),所以自适应控制的目标量必须是局部误差,而不是直接控制全局误差——后者不可测。
  • 放大关系:当 L·T 较大时,即使每步局部误差都合格,全局误差仍可能远超预期。此时需要更严格的容差,或改用能处理刚性的隐式方法。

这解释了自适应步长的核心逻辑:它并不直接保证全局精度,而是通过“每步局部误差 ≤ 容差”这一可执行的代理条件,间接地把全局误差压到可接受范围。容差 tol 是用户对“每步允许误差”的承诺,而全局误差是这个承诺经过累积与放大后的实际兑现结果。

四、一个可手算的示例

考虑简单方程 y′ = −λy,y(0)=1,取 λ=1,积分到 T=1,精确解 y(1)=e−1≈0.367879。用四阶 RK,设步长 h=0.1,共 10 步。该方法的局部误差主项系数约为 C≈1/120(示例近似值),则单步 LTE ≈ (1/120)·h5·|y(5)|。由于 y(5)=−y,量级约 0.37,故 LTE ≈ (1/120)·10−5·0.37 ≈ 3×10−8。10 步累积的全局误差量级约 3×10−7,与 O(h4) 的预期一致。若把 h 减到 0.05,全局误差约降为原来的 1/16。这些数字是用于说明量级关系的教学估算,并非实际运行输出。

五、工程实践中的判断要点

在实际使用自适应积分器(如 SciPy 的 solve_ivp 配 RK45,或 MATLAB 的 ode45)时,rtol 与 atol 控制的是局部误差估计,而非全局误差。常见做法与判断依据如下:

  • 先用默认容差(如 rtol=1e-3、atol=1e-6)跑一遍,观察步数与被拒步数;被拒步数占比过高说明容差过严或方程刚性。
  • 把 rtol 缩小 10 倍再跑,若结果变化远大于容差缩小比例,说明误差被动力学放大,需警惕全局误差。
  • 对守恒系统(如能量守恒的力学问题),用守恒量漂移作为全局误差的独立旁证,比单看局部误差估计更可靠。
  • 刚性方程不要一味收紧容差,应换用 BDF、Radau 等隐式方法,否则步长会被稳定性而非精度压得极短。
记住一句话:局部误差是“每步的账”,全局误差是“最终的账”,放大因子是“利息”。自适应步长管的是每步的账,能否管住最终的账,取决于利息高不高——也就是方程本身是否稳定。