什么样的数值结果值得相信:以 Lorenz 系统为例
一份计算物理课程汇报,题目是《从对流方程到可信的数值解》。幻灯片在线放映: soundadam.github.io/lorenz63,方向键翻页,按 N 打开讲稿。
一个悖论
用 scipy.solve_ivp 的 DOP853 积分 Lorenz 方程(σ=10, ρ=28, β=8/3),同一个初值,
一次 rtol=1e-6,一次 rtol=1e-12。前十个时间单位两条轨道贴得很好,然后各自脱钩,
差到吸引子的尺度。
哪一条是对的? 直觉说容差紧的那条。这在 t<10 时正确,在 t>40 时没有意义。
精度只换来对数的时间
把容差从 1e-4 扫到 1e-12,记下与参考解(rtol=1e-13)首次分离超过 1 的时刻:
| rtol | 分离时刻 |
|---|---|
| 1e-4 | 5.69 |
| 1e-6 | 10.62 |
| 1e-8 | 16.11 |
| 1e-10 | 20.71 |
| 1e-12 | 26.88 |
分离时刻对 ln(1/rtol) 是一条直线,斜率是最大 Lyapunov 指数的倒数(λ₁ ≈ 0.904)。 折成每一位:多一位精度,只多 ln 10 / λ₁ ≈ 2.55 个时间单位。 双精度的地板在 10⁻¹⁶,所以单条轨道的预报极限大约是 41,再怎么收紧容差也过不去。
但统计量不动
同样三次计算(rtol 取 1e-6、1e-9、1e-13),单条轨道在 t=10.5 和 18.3 就已经报废; 可它们的 Lorenz 映射(z 的相邻两个局部极大)重合到线宽以内,厚度是 z 值域的 0.0086%; z 的不变密度之间最大总变差 1%,主要来自有限采样。Lyapunov 谱同样对容差不敏感, 三个指数之和与相空间散度 −(σ+1+β) 的偏差在 10⁻⁹ 量级。
同一组数据,按轨道看是废品,按统计量看是完好的。
判据随系统类型而变
| 系统类型 | 验证手段 | 长时间单条轨道 |
|---|---|---|
| 保守(哈密顿) | 不变量有界,用辛格式 | 可信,误差多项式增长 |
| 耗散、非混沌 | 收敛到正确的稳态或极限环 | 可信 |
| 耗散、混沌 | 统计量对方法与容差不敏感 | 超过 1/λ₁ 量级不可信 |
守恒系统靠不变量验证,Lorenz 没有守恒量可查;混沌系统的单条轨道不可信,统计量可信。 汇报里用 Kepler 问题对照了第一行:Störmer–Verlet 的能量误差 1000 个周期不漂, RK4 的线性漂移,两者的「代价换时间」都是幂律,而 Lorenz 只有对数。
幻灯片里能玩的
- 封面回放两条初值相差 10⁻⁵ 的轨道,看 |Δ| 在 t≈13.6 涨到 1
- 开场悖论:自己换 rtol,看在哪个 t 与参考解脱钩
- 拖动 ρ 看对流卷怎么转
- 缩小初值差,看分离时刻只按对数后退
演示里的 DOP853 是照 scipy 的系数表用 JavaScript 重写的,在浏览器里实时积分。 讲台上用的两份打印稿也在同一个站点: 思维导图(A4 横向)与 板书小抄(A4 纵向)。
文中每个数字都由一个 Python 包实际算出,关键断言写成了测试——比如「三个 Lyapunov 指数之和等于散度」 和「分离时刻对 ln(1/rtol) 呈直线」。