我理解的Euler,Trapezoid和Midpoint方法

最近写了个游戏设计课关于物理计算的作业,需要用EulerTrapezoidMidpoint三种方法模拟一下炮弹的飞行。
上课没有听,后来看了下维基,开始以为很高大上,后来发现其实很容易理解。

所谓Euler方法,其实我很早以前很多关于物理计算的代码中就是这么实现的。
在一个连续的计算中,我们通常需要用到微积分的知识,但是计算机只能进行离散的模拟,因此将一段连续的过程分割成一个一个的step进行计算。
举一个很简单的例子,就比如平抛一个物体,速度随着时间是一直变化的。一个直观的想法就是在一定的时间认为速度不变化,用该速度当做整个间隔的速度计算。

Euler方法

假设计算的一个间隔的时间是dt,从状态t1t2,取在t1时刻的速度v1,位移v1*dt就是所谓的Euler方法。

Trapezoid方法

Trapezoid方法有些许不同,计算从状态t1t2,其中t1t2的位移和Euler方法一样,然后再算一次t2t3的位移,使用的状态是t2时刻的v2,得到一个新的位移,将两次位移去个平均就是这个方法。
因此Trapezoid的从t1t2的位移是(v1+v2)*dt/2

Midpoint方法

Midpoint方法是先计算1/2*dtEuler方法,得到t1t2的中间状态的速度v1.5,再使用v1.5作为整个状态的速度。
Midpoint方法从t1t2的位移是(v1.5)*dt

发现

值得一提的是,在我作业的实验中,由于速度的变化只和时间有关,和坐标无关,因此TrapezoidMidpoint方法的结果是一样的,通俗的可以认为他们的离散计算的gap是1/2个step,而Euler方法是1个step,所以1/2个step的离散模拟的方法和使用微积分的知识精确求解的方法的误差更小。

坚持原创技术分享,您的支持将鼓励我继续创作!