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 步——这在任何计算机上都不现实。实际运行中,你会看到求解器要么在极小的步长下“爬行”,要么在步长稍大时数值解突然发散、出现负浓度或剧烈振荡。这就是刚性最直观的表现:解是光滑的,但显式方法的稳定性把步长锁死了。
二、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(或梯形法)在相同区间上积分,记录步数、是否稳定、以及解的波形是否失真。你会看到显式方法要么步数爆炸,要么在翻转段出现明显振荡;而隐式方法即使取较大的步长,也能保持稳定并给出合理的波形。这个对比直接说明了刚性问题的核心矛盾:稳定性约束而非精度约束在主导步长选择。
三、从实验现象到判断:怎样确认“这是刚性问题”
做完上面两个实验,可以把观察到的现象归纳成几条可操作的判断线索。第一,看解本身:是否存在一段极短的时间内剧烈变化、随后长时间近乎平坦的区段。第二,看显式方法的步长行为:当精度要求并不苛刻时,步长是否仍被压到远小于解的变化尺度,且放大步长立刻导致振荡或发散。第三,看特征值分布:在准稳态点附近线性化,Jacobian矩阵特征值的实部是否全部为负但模长相差两三个数量级以上。三条线索中任意两条同时成立,基本可以判定为刚性问题,后续算法选型就应转向隐式方法或专门的自适应刚性求解器。
需要强调的是,刚性不是方程“坏”,而是问题本身包含多个时间尺度。Robertson问题和Van der Pol方程之所以成为经典测试集,正是因为它们用极少的变量把这种多尺度结构暴露得非常干净。在后续章节讨论BDF、Radau、隐式Runge–Kutta等方法时,可以随时回到这两个例子,用步数、稳定性和波形失真程度来检验算法是否真正“扛住了刚性”。