我在Python中执行Verlet算法时遇到问题。我尝试了这段代码:
x[0] = 1
v[0] = 0
t[0] = 0
a[0] = 1
for i in range (0, 1000):
x[i+1] = x[i] - v[i] * dt + (a[i] * (dt**2) * 0.5)
v[i] = (x[i+1] - x[i-1]) * 0.5 * dt
t[i+1] = t[i] + dt
但是它不能正常工作。怎么了?
我正在寻找Verlet算法的通用代码。
最佳答案
您的问题不是很清楚,但是代码中有一些错误来源。
例如,对于i
> 0
x[i+1] = x[i]-v[i]*dt+(a[i]*(dt**2)*0.5)
尝试使用
v[i]
的值,但是该元素在v
列表中尚不存在。举一个具体的例子,当
i
= 1时,您需要v[1]
,但是在那个阶段v
列表中唯一的东西是v[0]
; v[1]
直到下一行才计算。该错误应导致Python解释器显示错误消息:
IndexError: list index out of range
当寻求有关Stack Overflow的帮助时,请发布带有您问题的错误消息,最好从以下行开始:
Traceback (most recent call last):
这使人们阅读您的问题来调试您的代码变得容易得多。
FWIW,在
for
循环的第一次迭代中,当i
== 0时,x[i+1]
和x[i-1]
都引用相同的元素,因为在该阶段x
列表中有两个元素,所以x[-1]
是x[1]
。另外,奇怪的是您将
t
值存储在列表中。您不需要这样做。只需将t
存储为简单的float
值,并在循环中每次将其增加dt
即可;请注意,t
本身未在任何计算中使用,但您可能需要打印它。您的公式似乎与Basic Störmer–Verlet或Velocity Verlet的Wikipedia页面上给出的公式不匹配。例如,在我之前引用的代码行中,您减去了
v[i]*dt
,但应该添加它。也许您应该考虑实现相关的Leapfrog integration方法。 Leapfrog的同步版本易于编码,并且非常有效,IME。
从Wikipedia链接:
x[i+1] = x[i] + v[i] * dt + 0.5 * a[i] * dt * dt
v[i+1] = v[i] + 0.5 * (a[i] + a[i+1]) * dt
通常,没有必要将
a
值实际存储在列表中,因为这些值将使用相关力方程根据其他参数进行计算。关于python - Python中的Verlet算法实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29009771/