从「一半」到 e^(−Ct)

完整文档

从半衰期推导指数衰减.html(单文件,4 图示 + 3 动图 + 交互曲线,可离线打开)。
网页知识库:https://notes-dsw.pages.dev/static/exponential-decay.html。

不用微积分,只靠「每过一个半衰期 t_h 速度减半」+ 换底公式,推出 v(t) = v₀·e^(−Ct)。

三步

  1. 定义一半:经过 n 个半衰期后 v = v₀·(½)ⁿ(v₀ → v₀/2 → v₀/4 → v₀/8)。
  2. n 换成 t:n = t / t_h(允许非整数,如 1.5 个半衰期)→ v(t) = v₀·(½)^(t/t_h),已经能直接算。
  3. 换底:½ = 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自检恒等式

相关:网页知识库搭建说明