import numpy as np
N = 1000
dt = 0.1
x = np.zeros(N)
v = np.zeros(N)
t = np.arange(0,(N+0.5)*dt, dt)
a = np.ones(N)*1.0 # initial condition
x[[0,1]] = 1
v[1] = v[0]+a[0]*dt
for i in range (1,N-1):
x[i+1] = x[i]+v[i]*dt+(a[i]*(dt**2)*0.5)
v[i+1] = v[i] + a[i]*dt
你的实现有几个问题
0
中,您试图访问不存在的索引-1
,最后一个索引的索引i+1
也不存在。像这样的事情应该可以解决
不过,这并不是非常有效,最好使用
scipy.integrate.ode
来求解基本的运动微分方程。您的问题不是很清楚,但是您的代码中有一些错误源。
例如,对于
i
>;0尝试使用
v[i]
的值,但该元素尚不存在于v
列表中。举一个具体的例子,当
i
=1时,您需要v[1]
,但该阶段v
列表中唯一的东西是v[0]
;v[1]
直到下一行才计算。该错误应导致Python解释器显示错误消息:
在寻求有关堆栈溢出的帮助时,请将错误消息与您的问题一起发布,最好从以下行开始:
这使得人们更容易阅读你的问题来调试你的代码。
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 integration方法。同步版本的leapprog很容易编写代码,而且非常有效。
从维基百科链接:
通常,不需要将
a
值实际存储在列表中,因为它们将使用相关的力方程从其他参数计算。相关问题 更多 >
编程相关推荐