物理引擎与动画里,微分方程几乎无处不在:弹簧、刚体、布料、简单 AI 运动……核心往往是:已知 y˙=f(t,y)(或二阶 x¨=a(x,v)),用离散时间步 Δt 往前推状态。本文介绍四种常用方法:前向欧拉、后向欧拉、四阶龙格–库塔(RK4)、韦尔莱(Verlet),并在同一谐振子上对比它们的行为。
一阶初值问题:
y˙=f(t,y),y(t0)=y0.
游戏里更常见的是二阶力学:
x¨=a(x,v,t),
可写成一阶系统 x˙=v, v˙=a。下面四种方法里,前三种是通用一阶积分器;韦尔莱专为二阶力学设计,在保守力场里特别有用。
对比实验取无阻尼谐振子(ω=1):
x¨=−x,x(0)=1, x˙(0)=0,
解析解 x(t)=cost。步长刻意取偏大的 Δt=0.35,好让稳定性差异一眼可见:
谐振子对比(Δt = 0.35)
图中可以看出:前向欧拉振幅爆炸;后向欧拉过度阻尼、振幅塌缩;RK4 几乎贴住解析解;Verlet 相位会漂一点,但振幅长期可控。
yn+1=yn+Δtf(tn,yn).
力学形式(半隐式变体很常见,但标准显式是):
vn+1xn+1=vn+Δta(xn,vn),=xn+Δtvn.
(若用 xn+1=xn+Δtvn+1,则是 semi-implicit Euler / symplectic Euler,稳定性更好,别和纯前向欧拉混为一谈。)
特点
| |
|---|
| 阶 | 局部截断 O(Δt2),全局 O(Δt) |
| 代价 | 每步一次 f,最便宜 |
| 稳定 | 条件稳定;步长太大时谐振子能量单调增加 |
| 适用 | 原型、弱刚性、对精度不敏感的效果 |
直觉:每步用当前斜率沿切线走出一整步,弯曲轨道上会系统性“冲出去”。
x := x + dt * v
v := v + dt * a(x_old, v) // 注意:若 a 依赖新 x,顺序要写清楚
yn+1=yn+Δtf(tn+1,yn+1).
未知量出现在等式两边,一般要解非线性方程(牛顿迭代);对线性系统可直接求逆。上面谐振子例子里,把 (x,v) 联立后得到闭式:
xn+1=1+ω2Δt2xn+Δtvn,vn+1=vn−ω2Δtxn+1.
特点
| |
|---|
| 阶 | 仍是一阶,但 A-稳定:大步长通常不炸 |
| 代价 | 每步要求解;刚性系统里往往值得 |
| 行为 | 人为耗散强,振荡会被“捏死” |
| 适用 | 刚性约束、隐式约束求解、需要无条件稳定的场合 |
游戏里“完全后向欧拉 + 大规模非线性求解”成本高,更常见的是约束投影、XPBD、或半隐式方法;但理解后向欧拉有助于理解为什么隐式方法偏阻尼。
在 [tn,tn+Δt] 上取四个斜率再加权:
k1k2k3k4yn+1=f(tn,yn),=f(tn+2Δt,yn+2Δtk1),=f(tn+2Δt,yn+2Δtk2),=f(tn+Δt,yn+Δtk3),=yn+6Δt(k1+2k2+2k3+k4).
对状态向量 (x,v),把 f 换成系统右端即可(上文图表即如此)。
特点
| |
|---|
| 阶 | 全局 O(Δt4),同样 Δt 通常远准于欧拉 |
| 代价 | 每步 4 次 f |
| 稳定 | 显式方法,稳定域比欧拉大,但不是无条件稳定 |
| 适用 | 轨迹精度重要、力场光滑、可负担 4 倍力评估 |
经典“教科书精度”;实时物理里若力很贵(复杂碰撞、布料),会改用更便宜的 symplectic / Verlet 族。
针对 x¨=a(x)(加速度主要依赖位置,速度阻尼需另处理)。基本(Störmer–Verlet)形式:
xn+1=2xn−xn−1+Δt2a(xn).
只需当前位置与上一步位置,不必显式存速度。速度可由中心差分事后估计:
vn≈2Δtxn+1−xn−1.
Velocity Verlet(与位置 Verlet 同族、同阶)更方便同时推进 x,v:
xn+1an+1vn+1=xn+Δtvn+21Δt2an,=a(xn+1),=vn+21Δt(an+an+1).
特点
| |
|---|
| 阶 | 位置全局约 O(Δt2) |
| 结构 | 辛(symplectic)/ 时间可逆(在理想设定下)→ 长期能量误差有界振荡,不易像前向欧拉那样发散 |
| 代价 | 每步约一次 a(x)(Velocity Verlet 巧妙复用) |
| 适用 | 分子动力学、布料/软体、弹道、需要长时间稳定的保守系统 |
启动时若只有 x0,v0,可用
x−1=x0−Δtv0+21Δt2a(x0)
生成“上一步”,再进入递推。
| 场景 | 更合适 |
|---|
| 快速原型、视觉凑合 | 前向欧拉 / 半隐式欧拉 |
| 刚性大、绝不能炸 | 后向欧拉或其它隐式 |
| 要准、力不太贵 | RK4 |
| 长期力学、能量不能漂飞 | Verlet / Velocity Verlet |
| 有强阻尼、非光滑碰撞 | 单纯积分器不够,需配合约束/冲击求解 |
经验口诀:
- 显式便宜,步长受稳定性限制;
- 隐式稳,但耗散 + 求解成本;
- 高阶 RK 准,但不保辛结构;
- Verlet 为力学二阶方程“量身”,长时间表现往往优于同阶的朴素欧拉。
- 前向欧拉:y+Δtfn,简单,大步长易不稳定。
- 后向欧拉:y+Δtfn+1,稳但偏阻尼,要解方程。
- RK4:四次采样加权,精度高,力评估 ×4。
- Verlet:二阶力学专用,长时间振幅/能量更老实。
同一谐振子、同一大步长下,四条曲线已经把性格画清楚:会炸的、会瘫的、会贴解析解的、会慢慢相位漂移但仍“弹着”的。把这张图记在脑子里,读引擎 integrators 源码时会快很多。