2. 刚性现象直观认知

“刚性”这个词在教材里往往被定义成“Jacobian矩阵特征值实部负得很多且模长相差悬殊”,但定义本身并不能让人产生直觉。真正让人理解刚性的,是亲手跑一次数值实验:看着解在极短的时间里剧烈变化,随后又进入一段几乎平坦的缓慢演化,而显式方法却被迫用极小步长才能维持稳定。本节用两个经典例子——Robertson化学反应问题和Van der Pol方程——把这种“快慢共存”的现象摆到眼前。

一、Robertson问题:三个时间尺度叠在一起

Robertson问题是一个描述自催化化学反应的常微分方程组,形式如下:

y1' = -0.04*y1 + 1e4*y2*y3
y2' =  0.04*y1 - 1e4*y2*y3 - 3e7*y2^2
y3' =                        3e7*y2^2
初始条件:y1(0)=1, y2(0)=0, y3(0)=0,积分区间 [0, 1e5]

注意三个系数的量级:0.04、1e4、3e7,跨度接近九个数量级。这不是随手写的数字,而是真实化学反应速率常数的典型比例。取初值后,y2 在 t≈1e-4 量级内从 0 迅速爬升到约 3.6e-5 的峰值,随后在极短时间内回落,进入一个缓慢变化的准稳态阶段;而 y1 则从 1 缓慢衰减到接近 0,y3 缓慢上升到接近 1。整个过程跨越了从 1e-6 到 1e5 的时间尺度。

如果用经典的四阶显式Runge–Kutta(RK4)在 [0, 1e5] 上积分,会看到什么?在准稳态阶段,解本身几乎不变,但RK4的稳定域要求步长 h 满足 |hλ| 落在稳定区域内。该问题在准稳态处的特征值量级约为 -1e4 和 -3e7 量级,这意味着 h 必须小到约 1e-7 才能稳定。于是为了走完 1e5 的区间,需要约 1e12 步——这在任何计算机上都不现实。实际运行中,你会看到求解器要么在极小的步长下“爬行”,要么在步长稍大时数值解突然发散、出现负浓度或剧烈振荡。这就是刚性最直观的表现:解是光滑的,但显式方法的稳定性把步长锁死了。

判断依据:如果一段区间内解的变化率很小,但显式方法仍被迫使用远小于精度需求的步长,且步长再放大就出现振荡或发散,这几乎可以确定是刚性问题。Robertson问题中 y2 的准稳态段就是典型场景。

二、Van der Pol方程:刚性随参数μ增大而出现

Van der Pol方程是另一个常用例子,形式为:

y1' = y2
y2' = μ*(1 - y1^2)*y2 - y1
初始条件:y1(0)=2, y2(0)=0

当 μ 较小时(如 μ=1),解是光滑的极限环,显式方法可以轻松处理。但当 μ 增大到 1000 甚至更大时,解呈现出明显的“弛豫振荡”:y1 在大部分时间里缓慢漂移,然后在极短的过渡区内快速翻转,y2 随之出现尖峰。这种快慢交替的结构正是刚性的来源——在缓慢段,Jacobian的特征值量级约为 -μ,显式方法要求 h ~ 1/μ;而在快速翻转段,解本身的变化也要求小步长。两者叠加,使得显式方法在 μ=1000 时几乎无法在合理时间内完成积分。

一个值得做的对比实验是:固定 μ=1000,分别用显式Euler、RK4和隐式Euler(或梯形法)在相同区间上积分,记录步数、是否稳定、以及解的波形是否失真。你会看到显式方法要么步数爆炸,要么在翻转段出现明显振荡;而隐式方法即使取较大的步长,也能保持稳定并给出合理的波形。这个对比直接说明了刚性问题的核心矛盾:稳定性约束而非精度约束在主导步长选择。

刚性现象:快慢时间尺度共存与显式方法的稳定性困境 Robertson 问题:三尺度叠加 t y y₁ 缓慢衰减 y₂ 快速爬升→准稳态 y₃ 缓慢上升 快变区 准稳态慢变区(显式方法步长被锁死) 准稳态处 Jacobian 特征值量级 λ₁ ≈ -1e4,λ₂ ≈ -3e7 显式方法稳定要求 h ≲ 1/|λ₂| ≈ 3e-8 积分到 1e5 需约 1e12 步 → 不可行 Van der Pol 方程:μ 增大诱发刚性 t y₁ 快速翻转 缓慢漂移 μ 对刚性的影响 μ=1:光滑极限环,显式方法可用 μ=1000:慢变段特征值 ≈ -μ 显式方法步长 h ~ 1/μ,步数急剧膨胀

三、从实验现象到判断:怎样确认“这是刚性问题”

做完上面两个实验,可以把观察到的现象归纳成几条可操作的判断线索。第一,看解本身:是否存在一段极短的时间内剧烈变化、随后长时间近乎平坦的区段。第二,看显式方法的步长行为:当精度要求并不苛刻时,步长是否仍被压到远小于解的变化尺度,且放大步长立刻导致振荡或发散。第三,看特征值分布:在准稳态点附近线性化,Jacobian矩阵特征值的实部是否全部为负但模长相差两三个数量级以上。三条线索中任意两条同时成立,基本可以判定为刚性问题,后续算法选型就应转向隐式方法或专门的自适应刚性求解器。

需要强调的是,刚性不是方程“坏”,而是问题本身包含多个时间尺度。Robertson问题和Van der Pol方程之所以成为经典测试集,正是因为它们用极少的变量把这种多尺度结构暴露得非常干净。在后续章节讨论BDF、Radau、隐式Runge–Kutta等方法时,可以随时回到这两个例子,用步数、稳定性和波形失真程度来检验算法是否真正“扛住了刚性”。

实验时注意:显式方法在刚性问题上发散,不代表代码写错了,而是方法本身的稳定域不够。不要试图通过减小误差容限来“修好”它——那只会让步长更小、计算更慢。正确的做法是换用具有A稳定性或L稳定性的隐式方法。