Python Velocity Verlet集成产生大量结果

Python Velocity Verlet集成产生大量结果,python,physics,Python,Physics,作为我制作的向量类/“物理引擎”的一部分,我试图实现一个速度verlet算法来求解牛顿的运动方程。然而,我所实现的算法正在产生大量的值,正如您在下面看到的。我已经尝试了我认为是我自己的每一个选择,并想知道是否有人可以帮助。谢谢 Xpos = 0 OldPos = 1 dt = 0.02 Xaccel = 9.81 def doVerletX(currentPos, oldPos, accel, dt): newPos = (currentPos + (currentPos-oldPos

作为我制作的向量类/“物理引擎”的一部分,我试图实现一个速度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

我知道这显然是错误的,我想知道如何解决它?

已经提到的是
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
at
t=-0.02
使用
x(0)=x0=0
x(-0.02)=1

v0=-(1-0.02^2/2*9.81)/0.02=-49.9019  and  x(0.18)=-8.82342

这正是上面计算的值。这是2阶方法的应有结果。

dt
是delta t吗?你为什么要做
dt+=dt
?另外,我认为在调用函数时,您的参数的顺序是错误的。在函数定义中,
dt
是第四个参数,在调用过程中,您将
dt
作为第三个参数传递。在现实生活中,该对象将移动-9个单位,但这里的verlet算法表示-8.82,它们是大约2%的误差,因此我想知道该误差是否会累积增长,如果是这样的话,会使模拟变得非常不准确,因为只有10次迭代后,误差为2%。位置的公式是
x(t)=-50*t+0.5*9.81*t^2
,在
t=0.18
处给出
-8.841078
,距离不远。速度如何等于-50,因为当你做currentPos-oldPos时,你并没有除以dt。另外,OldPos,Xpos=Xpos,newPos部分是什么意思(我知道你在把事情等同起来,但我不确定是什么意思)。
(x(0)-x(-0.02))/0.02=-50
。当然,这只是平均值的估计。我在答案中加入了精确解的完全精确计算。