从「一半」到 e^(−Ct)
完整文档
从半衰期推导指数衰减.html(单文件,4 图示 + 3 动图 + 交互曲线,可离线打开)。
网页知识库:https://notes-dsw.pages.dev/static/exponential-decay.html。
不用微积分,只靠「每过一个半衰期 t_h 速度减半」+ 换底公式,推出 v(t) = v₀·e^(−Ct)。
三步
- 定义一半:经过 n 个半衰期后
v = v₀·(½)ⁿ(v₀ → v₀/2 → v₀/4 → v₀/8)。 - n 换成 t:
n = t / t_h(允许非整数,如 1.5 个半衰期)→v(t) = v₀·(½)^(t/t_h),已经能直接算。 - 换底:
½ = e^ln(½) = e^(−ln2);(a^b)^c = a^(bc)→v(t) = v₀·e^(−(ln2/t_h)·t);令 C = ln2 / t_h →v(t) = v₀·e^(−Ct)。
自检:t = t_h 时 e^(−C·t_h) = e^(−ln2) = 1/2 ✓。
为什么代码用 e
exp() 是底层标准函数、快;多个衰减相乘 = 指数相加;求导积分最干净;(½)^x 内部也是 exp(x·ln(½))。工程写法:
const float C = FMath::Loge(2.f) / HalfLife; // C = ln2 / t_h
Velocity *= FMath::Exp(-C * DeltaTime); // 与帧长解耦速查
| 式子 | 含义 |
|---|---|
C = ln2 / t_h ≈ 0.6931 / t_h | 衰减常数(s⁻¹) |
v(t) = v₀·(½)^(t/t_h) = v₀·e^(−Ct) | 两种写法恒等 |
v *= exp(−C·dt) | 逐帧更新 |
v(t_h) = v₀/2 | 自检恒等式 |
相关:网页知识库搭建说明