【问题标题】:Velocity Verlet integration producing massive results pythonVelocity Verlet 集成产生大量结果 python
【发布时间】:2017-09-29 10:50:59
【问题描述】:

作为我正在制作的矢量类/“物理引擎”的一部分,我正在尝试实现速度 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 是 delta t?你为什么要dt+=dt?另外我认为调用函数时您的参数顺序错误。在函数定义中dt 是第四个参数,在调用过程中您将dt 作为第三个参数传递。

标签: python physics


【解决方案1】:

已经提到了应该是t+=dtdt+=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 使用x(0)=x0=0x(-0.02)=1 给予

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

这正是上面计算的值。这与 order 2 方法应该是一样的。

【讨论】:

  • 在现实生活中,该对象会移动 -9 个单位,但这里的 verlet 算法说 -8.82,它们的误差约为 2%,所以我想知道这个误差是否会累积增长,并且如果是这样,那么模拟会非常不准确,因为 2% 的误差仅发生在 10 次迭代之后。
  • 该职位的公式是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。当然,这只是平均值的估计。我在答案中添加了精确解的完全精确计算。
猜你喜欢
  • 2013-02-16
  • 2011-05-02
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
相关资源
最近更新 更多