Не уверен, где возникает ошибка объекта с плавающей запятой

#python #scipy

#python #scipy

Вопрос:

У меня возникли проблемы с использованием odeint. У меня проблема с моим кодом, в котором при запуске TypeError float не подписывается, и я не уверен, почему. Похоже, что мой r0 или мой список dr внутри функции F вызывает ошибку, но я просто не понимаю, в чем проблема.

     #Import packages to name space
import numpy as np
from scipy.integrate import odeint as ode

#Define constants and initial conditions
Cd = 0.35
p_air = 1.2 #kg/m^3
a = 0.037 #m
m = 0.145#kg
g = 9.8 #kgm/s^2
theta = np.pi/4
v0 = 60#m/s
r0 = [0,v0*np.cos(theta),0,v0*np.sin(theta)] #[x0,vx0,y0,vy0]
start,stop,step = 0,10,0.1
t = np.arange(start,stop step,step)


#Define function to pass into odeint
def F(t,r0,const):
    C,p,a,m,g = const
    dr = [0,0,0,0] #[x',vx',y',vy']
    dr[0] = r0[2]
    dr[2] = r0[3]
    dr[1] = -(1/(2*m))*C*p*np.pi*a**2*r0[1]*np.sqrt(r0[1]**2   r0[3]**2)
    dr[3] = -(1/(2*m))*C*p*np.pi*a**2*r0[3]*np.sqrt(r0[1]**2   r0[3]**2) - g
    return dr

result = ode(F,r0,t,args=([Cd,p_air,a,m,g],))
 

Код ошибки:

 ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-48-c5fa1231ea3d> in <module>
     26     return dr
     27 
---> 28 result = ode(F,r0,t,args=([Cd,p_air,a,m,g],))

~anaconda3libsite-packagesscipyintegrateodepack.py in odeint(func, y0, t, args, Dfun, col_deriv, full_output, ml, mu, rtol, atol, tcrit, h0, hmax, hmin, ixpr, mxstep, mxhnil, mxordn, mxords, printmessg, tfirst)
    239     t = copy(t)
    240     y0 = copy(y0)
--> 241     output = _odepack.odeint(func, y0, t, args, Dfun, col_deriv, ml, mu,
    242                              full_output, rtol, atol, tcrit, h0, hmax, hmin,
    243                              ixpr, mxstep, mxhnil, mxordn, mxords,

<ipython-input-48-c5fa1231ea3d> in F(t, r0, const)
     20     C,p,a,m,g = const
     21     dr = [0,0,0,0] #[x',vx',y',vy']
---> 22     dr[0] = r0[2]
     23     dr[2] = r0[3]
     24     dr[1] = -(1/(2*m))*C*p*np.pi*a**2*r0[1]*np.sqrt(r0[1]**2   r0[3]**2)

TypeError: 'float' object is not subscriptable
 

Комментарии:

1. Пожалуйста, обновите свой вопрос с полным ответом на ошибку.

2. Трудно даже найти r0 , что сказать об анализе. Примените некоторое форматирование кода, теперь он выглядит как шестнадцатеричный дамп ascii.

3. Я голосую за закрытие, потому что вы не предоставили полный исполняемый пример. И после того, как я попытался обойти ваши упущения, я обнаружил, что вы не определили F функцию, указанную odeint

4. Я не включил полную работоспособную версию кода, потому что в прошлый раз, когда я это делал, люди сказали мне не делать этого.

5. Перед тем, как это было закрыто, я внес правку, чтобы устранить проблемы, с которыми люди столкнулись с сообщением. Однако он все еще был закрыт. Кроме того, ответ заключается в том, что аргументы позиции и времени в функции F были в неправильном порядке.

Ответ №1:

Потому что вызов odeint имеет этот синтаксис:

 result = ode(F,r0,t,args=([Cd,p_air,a,m,g],))
 

odeint ожидает получения функции, начальных условий и временного пространства в таком порядке. Но функция использовала временное пространство и начальные условия в неправильном порядке, изменив строку определения функции с def F(t,r0,const): на, чтобы def F(r0,t,const): она работала нормально.