类型错误:'float'对象没有属性'__getitem__' Python NBody模拟。

时间:2021-10-21 08:17:49

I want to make N-Body simulation using Hermite Algorithm, but when I write this code, I keep getting an error, that said:

我想用Hermite算法做n体模拟,但是当我写这段代码的时候,我总是会出错,说:

TypeError: 'float' object has no attribute '__getitem__'

and I have no idea why it's happen, because my object in list is not float.

我不知道它为什么会发生,因为我的对象不在列表中。

dt    = input('dt = ')
t_end = input('t_end = ')
n = input('n= ')
t = input('t= ')

m = np.zeros(n)
r = np.zeros((n, 3))
rji = np.zeros((3))
vji = np.zeros((3))
v = np.zeros((n, 3))
a = np.zeros((n, 3))
jk = np.zeros((n, 3))


for i in range (0,n,1):
    m[i] = 2
    for k in range (0,3,1):
        r[i,k] = 2+i
    for k in range (0,3,1):
        v[i,k] = 1+i
    print ('m'),m,r,v


for i in range (0,n,1):
    for k in range (0,3,1):
        a[i,k] = jk[i,k] = 0.0
for i in range (0,n,1):
    for j in range (i+1,n,1):
        for k in range (0,3,1):
            rji[k] = r[j,k] - r[i,k]
            vji[k] = v[j,k] - v[i,k]


    r2 = 0.
    for k in range (0,3,1):
        r2 += rji[k] * rji[k]
    r3 = r2 * math.sqrt(r2)
    rv = 0.
    for k in range (0,3,1):
        rv += rji[k] * vji[k]
    rv /= r2
    for k in range (0,3,1):
        a[i,k] += m[j] * rji[k] / r3;
        a[j,k] -= m[i] * rji[k] / r3;
        jk[i,k] += m[j] * (vji[k] - 3 * rv * rji[k]) / r3;
        jk[j,k] -= m[i] * (vji[k] - 3 * rv * rji[k]) / r3;

ekin = 0.
epot = 0.

for i in range (0,n,1):
    for j in range (i+1,n,1):
        for k in range (0,3,1):
            rji[k] = r[j,k] - r[i,k] #the error coming from this line

    r2=0.
    for k in range (0,3,1):
        r2 += rji[k] * rji[k]
        print rji
    r = math.sqrt(r2)
    epot -= m[i] * m[j] / r
for k in range (0,3,1):
    ekin += 0.5 * m[i] * v[i,k] *v[i,k]
e_in = ekin + epot
print('Initial total energy E_in = '), e_in

1 个解决方案

#1


1  

I'm not sure if this is the source of error that you are seeing, but you are missing a variable name in this line (last line of all the loops):

我不确定这是否是您所看到的错误的来源,但是您在这一行中丢失了一个变量名(所有循环的最后一行):

        ekin += 0.5 * m[i] * v[i][k] *[i][k]

That should be

这应该是

        ekin += 0.5 * m[i] * v[i][k] * v[i][k]

A comment on your code: you are using 2-dimensional numpy arrays, so you can index them as, for example, v[i,k] instead of v[i][k]. That notation is much more efficient, and it's easier to read.

对您的代码的注释:您正在使用二维的numpy数组,因此您可以将它们作为一个索引,例如,v[i,k]而不是v[i][k]。这个符号更有效,而且更容易阅读。

#1


1  

I'm not sure if this is the source of error that you are seeing, but you are missing a variable name in this line (last line of all the loops):

我不确定这是否是您所看到的错误的来源,但是您在这一行中丢失了一个变量名(所有循环的最后一行):

        ekin += 0.5 * m[i] * v[i][k] *[i][k]

That should be

这应该是

        ekin += 0.5 * m[i] * v[i][k] * v[i][k]

A comment on your code: you are using 2-dimensional numpy arrays, so you can index them as, for example, v[i,k] instead of v[i][k]. That notation is much more efficient, and it's easier to read.

对您的代码的注释:您正在使用二维的numpy数组,因此您可以将它们作为一个索引,例如,v[i,k]而不是v[i][k]。这个符号更有效,而且更容易阅读。