您的问题不是很清楚,但是您的代码中有一些错误来源。
例如,对于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。例如,在我之前引用的代码行中,您正在减去v[i]*dt
但您应该添加它。
也许您应该考虑实现相关的Leapfrog 集成方法。Leapfrog 的同步版本很容易编码,而且非常有效,IME。
从维基百科链接:
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
值实际存储在列表中,因为它们将使用相关的力方程从其他参数计算出来。