为什么RK4比Euler集成更好?[关闭]


20

这些精彩幻灯片的结尾,作者比较了所介绍的所有不同集成商。除了改进的Euler集成Runge Kutta 4集成(均通过所有测试)外,它们都无法实现。

我想我应该提到我正在开发一个物理强度不是很高的2D游戏。我只是想知道改进的Euler集成会在哪里出现不足,而必须使用RK4。

我的游戏主要包括简单的重力(跳跃和下降),沿X和Y轴的运动以及边界框碰撞。实施RK4是否值得,还是经过改进的Euler足以满足要求?我看到了很多讨论都对Euler Integration的用户提出了质疑,但是据我所知,改进的Euler在简单的2D问题上是同等的。我想它也会更快。


题外话,但这些幻灯片很好,示例和所有内容都很清晰。感谢您的链接!
罗伊(Roy T.)

如果这确实不是话题,那么计算科学可能很适合。
David Z

另外:时间校正的Verlet集成 -类似于改良的Euler:太懒了,无法弄清楚它是否完全相同。TCV很棒,因为您可以宽容固定的时间步长(其他集成商希望保证有固定的时间步长)。
乔纳森·迪金森

1
无法编辑:我看到他提到了。我不确定他的实现是否违反了本文概述的初始条件要求:但是,如果我正确地计算初始条件,我的TCV实现就不会出现重力问题。
乔纳森·迪金森

Answers:


15

对于大多数模拟,我个人更喜欢Velocity Verlet。以我对这种方法的经验,它非常适合于非常僵硬的方程式。似乎这种“改进的Euler”方法与Velocity Verlet方法非常相似,并且依赖于一类称为预测器-校正器的积分方法。如今,您可以阅读有关这些方法的很多内容,从David Baraff的“布料模拟中的大步骤”开始,其中隐式方法的功能真正发挥了作用。他们的失败是您:

  1. 必须近似于Jacobians或Hessians,然后必须
  2. 计算每帧相当数量的矩阵逆。

因此,如果您不是数学大师,则可能会卡住手指。只需尝试使用您想要的任何一种方法,然后解决似乎最适合您的方法。简单不一定总会更好,但是对于交互式帧速率,我只知道一个字:妥协。

您可能需要查看一些其他资源:

雅各布森(Jakobsen)是个天才,他提出了一个关于自负问题的简单想法(他的专长是密码学,如果没有犯错,但是他成功地证明了他的方法在数学上等价于一类高斯-赛德尔迭代算法的收敛性) )。为简单起见,请先深入研究隐式方法。

后来的编辑:最近我收到了一篇有关使用显式积分器进行软或半刚性车身仿真的问题的论文,它们对性能和质量有何影响。该文件应作为选择一定的积分,具体取决于该方案的指导。


1
+1就内容而言,这实际上是一个非常好的质量答案:但这有点难以消化(文本墙)。我发现良好的格式总是有助于提高投票率。我改进了它,希望您能得到应得的赞成票。
乔纳森·迪金森

谢谢乔纳森(Jonathan),我匆忙完成了此工作,无视“对读者友好”的程序,但是我不得不提到那些资源,因为即使在今天,它们仍然非常频繁地使用。
teodron'3

10

问:为什么要使用高级Runge Kutta?
答:因为这很准确。

问:为什么不呢?
答:因为您正在制作游戏,并且非常精确的物理引擎并不重要,所以它必须足以欺骗玩家。

顺便说一句,如果您像大多数平台游戏玩家一样在碰撞时承受了沉重的负担,那么简单的Euler就可以了。

我强烈建议您与演示文稿中的代码不同,使用固定步长物理,这可以节省一些潜在的毛刺,并让您以非常简单的方式解决球获得或失去能量的问题。只是在显式和隐式集成之间寻求中间立场:

velocity += 0.5 * acceleration;
position += velocity;
velocity += 0.5 * acceleration;

演示文稿未显示的是如何处理碰撞,以使对象看起来不会超出边界。解决该问题的简单方法是使用较高的更新频率。一个更复杂但性能可能更好的解决方案是在碰撞时将对象移回,确切的实现取决于所需的物理行为。


1
+1表示“欺骗玩家”-但由于欧拉集成,我个人的“非常简单”的系统爆炸了。
乔纳森·迪金森

@JonathanDickinson我要说的不是因为Euler集成,而是因为环境的混合,Euler集成只是其中之一。如果您有一个示例,我相信我可以找到一种避免系统爆炸的方法。
aaaaaaaaaaaaaa 2012年

哦,在我了解RK / Verlet之前,它是在我的一些非常古老的VB6东西上(当时我大约是14岁)-我什至没有代码了:这充分证明了事实可能是另外一些东西在混合中:)。
乔纳森·迪金森

1
我想我应该补充一点,就是一旦您开始弄乱对象之间的吸引力,而不仅仅是简单的引力,对我来说加紧积分方法似乎是合理的,这可能不是严格必要的,但是如果您具备处理能力,唯一的缺点是代码稍微复杂一些。
aaaaaaaaaaaaaa 2012年

1

演示文稿有错误。演示者称为“改进的欧拉”的方法实际上是速度Verlet方法!

有关更多权威信息源,请参见此处:http : //www.physics.udel.edu/~bnikolic/teaching/phys660/numerical_ode/node5.html

同样的等式在维基百科中

主持人可能想到的是对欧拉方法的一个普遍的立即改进,就是演示者可能想到的中点方法,但最终却把Velocity Verlet误认为是改进的欧拉。中点方法和速度Verlet之间的唯一区别是速度是上一次和下一次加速度的平均值,而不是仅依赖于上一次加速度。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.