#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):
она работала нормально.