我决定不再偷懒,而是展示了原始 Verlet 方法在可变步长下的外观的某种推导。因为看起来 Dummer 的这种错误改编比我想象的更普遍,这令人难过。我还注意到,正如上面的答案所指出的,正确的版本现在与 Dummer 一起在维基百科上,尽管它是在我的“建议的正确答案”之后添加的。
当我查看 Verlet 方法时,我发现它看起来很像跳跃、速度 Verlet、隐式 Euler 等,它们看起来像修改中点的二阶版本,其中一些可能是相同的。在每一个中,在某种程度上,他们都有一个跨越式的想法,其中加速度的积分(到速度)和恒定速度的积分(到位置)各自交错,使它们重叠一半。这带来了诸如时间可逆性和稳定性之类的东西,这对于模拟的“真实性”来说比准确性更重要。而“真实感”,即可信度,对于电子游戏来说更为重要。我们不在乎某物移动到的位置是否与它的确切质量真正引起的位置略有不同,只要它的外观和感觉实际的。我们并没有计算将我们的高功率卫星望远镜指向哪里来观察遥远物体的特征或未来的天体事件。在这里,稳定性和效率优先于数学准确性。因此,似乎越级方法是合适的。当您为可变时间步调整越级时,它会失去一些优势,并且会失去一些对游戏物理的吸引力。Stormer-Verlet 类似于蛙跳,除了它使用上一步的平均速度而不是单独保持的速度。您可以像蛙跳一样调整这个 Stormer-Verlet。要将前进速度与固定加速度相结合,您使用前一步长度的一半和下一步长度的一半,因为它们是交错的。如果台阶像真正的跨越式一样固定,它们的长度相同,因此两个半长之和为一。我使用 h 作为步长,使用 a/v/p 作为加速度/速度/位置,使用 hl/pl 作为上一步中的“最后一个”。这些不是真正的方程式,更像是赋值操作。
原始越级:
v = v + a*h
p = p + v*h
使用可变时间步长:
v = v + a*hl/2 + a*h/2
p = p + v*h
因素a/2
:
v = v + a*(hl + h)/2
p = p + v*h
使用先前位置(p - pl)/hl
作为初始速度:
v = (p - pl)/hl + a*(hl + h)/2
p = p + v*h
代替,我们不需要v
:
p = p + ( (p - pl)/hl + a*(hl + h)/2)*h
分发h
:
p = p + (p - pl)*h/hl + a*h*(h + hl)/2
结果并不像 Verlet 的原始 Stormer 形式那样简单或快速,2p - pl + a*h^2
. 我希望这有点道理。您将省略实际代码中的最后一步,无需乘以h
两次。