我在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–VerletVelocity 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/

10-12 17:02