0

我正在尝试使用 Vertel 算法求解微分方程,但我无法摆脱这个错误。有什么建议么?

def Vertel(dt, x0, v0, t, tstop, pravastrana, M=1):
    i = 0
    x = x0
    v = v0
    k  = 1     # Spring constant
    m  = 1 

    while t <= tstop:

    a = -(k/m)* x[i]

    if i == 0:
        v_next = v[i] + a* dt
        x_next = x[i] + v_next* dt
    else:
        x_next = 2* x[i] - x[i-1] + a* dt** dt
    x.append(x_next)
    t.append(t[i] + dt)
    i = i + 1
    t = t + dt
    return(x, t)

print(*Vertel(0.1 ,1 ,1 , 0, 10, pravastrana_1, ))

在我定义的线上,a我收到错误消息:

> 'int' object is not subscriptable

任何帮助表示赞赏,谢谢

4

1 回答 1

1

您要初始化xv作为列表,

x = [x0]
v = [v0]

为了获得 Verlet 算法的正确顺序,您还可以考虑将第一步初始化为更高的顺序,如

    v_next = v[i] + 0.5*a* dt
    x_next = x[i] + v_next* dt

因为这为二次项提供了正确的泰勒展开。请注意,速度现在对于半步位置是正确的,因为它将在 Leapfrog Verlet 变体中使用。

第一个错误会掩盖一些问题,例如同时对t标量变量和列表进行双重处理,甚至更多。

于 2021-03-28T19:30:29.507 回答