Velocity Verlet集成产生巨大的结果python

时间:2017-09-29 10:51:00

标签: python physics

作为矢量类的一部分/"物理引擎"我正在制作,我正在尝试实现速度verlet算法来解决牛顿运动方程。但是,我已经实现的算法正在生成大量值,如下所示。我已经尝试过我自己认为的每一种选择,并且想知道是否有人可以提供帮助。感谢。

Xpos = 0
OldPos = 1
dt = 0.02
Xaccel = 9.81

def doVerletX(currentPos, oldPos, accel, dt):
    newPos = (currentPos + (currentPos-oldPos) + (accel*dt*dt))
    return newPos

for a in range (1,10,1):
    newPos = doVerletX(Xpos,OldPos,dt,Xaccel)
    print(newPos)
    OldPos = Xpos
    dt+=dt

上述代码的输出是:

0.9247220000000003
3.8494440000000005
7.698888000000001
15.397776000000002
30.795552000000004
61.59110400000001
123.18220800000002
246.36441600000003
492.72883200000007

我知道这显然是错误的,并且想知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

已经提到的dt+=dt问题应该是t+=dt

在时间传播中,您还需要将newPos值移至Xpos

doVerlet的接口定义有dt作为最后一个参数,你也必须在函数调用中使用它。

Xpos = 0
OldPos = 1
t=0
dt = 0.02
Xaccel = 9.81

def doVerletX(currentPos, oldPos, accel, dt):
    newPos = (currentPos + (currentPos-oldPos) + (accel*dt*dt))
    return newPos

for a in range (1,10,1):
    newPos = doVerletX(Xpos,OldPos,Xaccel,dt)
    t+=dt    
    print(t,newPos)
    OldPos, Xpos = Xpos, newPos

使用该代码给出结果

(0.02, -0.996076)
(0.04, -1.988228)
(0.06, -2.976456)
(0.08, -3.960760)
(0.10, -4.941140)
(0.12, -5.917596)
(0.14, -6.890128)
(0.16, -7.858736)
(0.18, -8.823420)

这是可信的,因为初始速度为-50 m/s,而加速度为正。

要获得正确的初始速度,从而得到精确的解决方案,就必须解决

x(t)=x0+v0*t+0.5*g*t^2
使用v0t=-0.02提供<{1}} x(0)=x0=0的{​​{1}}

x(-0.02)=1

这正是上面计算的值。这与订单2方法一样。