math - 时间修正的 Verlet 数值积分公式

标签 math game-physics numerical-methods numerical-integration verlet-integration

有一个常用的verlet-integration Johnathan Dummer 在网上的公式,称为 Time-Corrected Verlet。但是我读过几个论坛帖子,人们在某些情况下会得到奇怪或意外的结果。

Formula by Johnathan Dummer:

x1 = x + (x – x0) * dt / dt0 + a * dt^2

还有一个stackoverflow answer ,其中指出 Dummer 的时间校正公式被破坏,并且海报将他自己的推导呈现为正确的推导。

Suggested correct formula by a stackoverflow answer
x1 = x + (x – x0) * dt / dt0 + a * dt * (dt + dt0) / 2

那么,Dummer 的公式真的被打破了吗?如果是,海报的推导是否更好?

PS:Dummer使用verlet积分公式x1 = x - x0 + a * dt^2也很奇怪在他的网站上而不是正确的 x1 = 2x - x0 + a * dt^2 .

最佳答案

维基百科页面Verlet integration - Non-constant time differences给出两个公式,不做引用。我自己没有检查过推导,但第二个改进公式的推理看起来很合理。

我已经下载了 Dummer 的电子表格并修改了其中一个公式以使用更正。结果要好得多。

Comparison of methods

确切的结果以黄色显示,我们看到仅使用具有波动帧速率的普通 Verlet 算法是很糟糕的。 Dummer 的红色时间正确变体非常好,但有点偏离。带有改进校正的深绿色版本要好得多。

对于具有二次解的重力射弹,您可能会发现改进版本是准确的。当度数变得更高时,它将与真实路径不同,可能值得测试以查看我们是否仍能获得更好的近似值。

Comparing methods for sin

对 sin 曲线进行相同的计算表明改进的方法要好得多。在这里,时间正确的 Verlet 漂移了很多。改进后的版本更好,与确切答案仅相差一点点。

对于PS。注意如果在TCV公式中设置dt=dt0

x1 = x + (x – x0) * dt / dt0 + a * dt^2

你得到
x1 = x + x – x0 + a * dt^2
   = 2 x – x0 + a * dt^2

原始的 Verlet 公式。

关于math - 时间修正的 Verlet 数值积分公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32709599/

相关文章:

algorithm - 用区间确定sin波范围[a, b]的高效算法

java - 有人可以解释如何实验重力值吗?

python - Hindmarsh-Rose 模型的相空间轨迹

c++ - 在 OpenCL 中实现

c# - Math.Round 返回奇数向上舍入但偶数向下舍入

c++ - 使用相机旋转使四边形始终出现在相机前面(c++/opengl)

C++ 将 3D 速度 vector 转换为速度值

javascript - 转换被添加......无休止

haskell - Haskell 中的 Verlet 集成

computational-geometry - 由坐标集定义的区域的数值积分?