作为矢量类的一部分/"物理引擎"我正在制作,我正在尝试实现速度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
我知道这显然是错误的,并且想知道如何解决这个问题?
答案 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
使用v0
和t=-0.02
提供<{1}} x(0)=x0=0
的{{1}}
x(-0.02)=1
这正是上面计算的值。这与订单2方法一样。