Python 错误,“int”对象不可下标

Python error, 'int' object is not subscriptable

提问人:Nitaa a 提问时间:3/29/2021 最后编辑:Lutz LehmannNitaa a 更新时间:3/29/2021 访问量:128

问:

我正在尝试使用 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

任何帮助都值得赞赏,谢谢

python-3.x 微分方程 verlet 积分

评论

0赞 Bijay Regmi 3/29/2021
您正在尝试下标要传递的整数,并且对传递到的整数 1 和 1 的操作无效v[i]x[i]vertel
0赞 David Buck 3/29/2021
发布 Python 问题时,请确保问题中的缩进与您的代码匹配。您发布的代码无法运行。
0赞 Lutz Lehmann 3/29/2021
由于只有第一行和最后一行被移位以破解缩进的代码标记,因此使用代码围栏很容易修复。如果不对其大量行进行更改,代码仍将无法运行。

答:

1赞 Lutz Lehmann 3/29/2021 #1

您要初始化 and 作为列表,xv

x = [x0]
v = [v0]

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

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

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

会有一些问题被第一个错误所掩盖,比如同时对标量变量和列表进行实际的双重处理,甚至可能更多。t

评论

0赞 Nitaa a 3/29/2021
太好了,非常感谢!是的,还有一些工作。正确的做法是:定义 ts = [t],然后用 ts.append(t) 代替 t.append(t[i] + dt)。第一步的更高阶可能是要走的路。
0赞 Lutz Lehmann 3/29/2021
或者,为了变量方案的统一性,将参数作为 、 设置,然后使用 或 每当访问最近的时间时。t0t=[t0]t[i]t[-1]