"float" не подлежит подписке "в одеинте - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь реализовать связанные дифференциальные уравнения в Python, и, как новый пользователь, я, кажется, застрял в чем-то.Я использовал этот учебник в качестве руководства по решению моих ODE и заглянул в документацию , недоступную

Здесь я определяю функцию

def Burnout(t, y, m, nu, S0, V, delta, mu):
    S = y[0];

    E = [0 for i in range(0,m)]
    dEdt = [0 for i in range(0,m)]

    for i in range(0,m):
        E.append(y[i+1])

    P = y[m+1]

    dSdt = -nu*S*P*(S/S0)**V
    dEdt.append(nu*S*P*(S/S0)**V-m*delta*E[0])

    for i in range(1,m):
        dEdt.append(m*delta*E[i-1]-m*delta*E[i])

    dPdt = m*delta*E[m-1]-mu*P

    return [dSdt, *dEdt[0:m], dPdt]

Затем, как и в учебнике, я определяю начальные условия как

 S0 = N
 y0.append(S0)

 for i in range (0, m):
    E.append(0)
    y0.append(E[i])

 P0 = Z
 y0.append(P0)

, где N и Z - ранее определенные вещи, а E - пустой массив.Когда я наконец вызываю odeint (Burnout, y0, t, args = p), я получаю, что объект 'float' не является приемлемым, указывая на мое определение S в моей функции Burnout.Когда я передал список в odeint, я немного запутался, почему Python говорит, что я передал float.Кто-нибудь видит, что я сделал не так?Заранее спасибо!

РЕДАКТИРОВАТЬ: Хорошо, теперь вот минимальный, полный и проверяемый пример, который дает мне ту же ошибку

import numpy как np из scipy.integrate import odeint

 def Burnout(t, y, m, nu, S0, V, delta, mu):

    S = y[0]

    E = [0 for i in range(0,m)]
    dEdt = [0 for i in range(0,m)]

    for i in range(0,m):
        E.append(y[i+1])

    P = y[m+1]

    dSdt = -nu*S*P*(S/S0)**V
    dEdt.append(nu*S*P*(S/S0)**V-m*delta*E[0])

    for i in range(1,m):
        dEdt.append(m*delta*E[i-1]-m*delta*E[i])

    dPdt = m*delta*E[m-1]-mu*P

    return [dSdt, *dEdt[0:m], dPdt]


V = 2.97
m = 26
delta = 1/6
mu = 1
nu = 10
S0 = 5

t = np.linspace(0,56,100)

y = [10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100]
p = (m, nu, V, S0, delta, mu)
print(odeint(Burnout,y,t,args=p))

1 Ответ

0 голосов
/ 12 июня 2018

Вы указали неверные аргументы в своем определении оды.Возможно иметь t до y, но тогда вы должны определить tfirst = True (см. Документы) .

Замена аргументов в вашем определении Burnout исправляетпроблема для меня.

def Burnout(y, t, m, nu, S0, V, delta, mu):
   # ...
   # rest of function
   # ...

В качестве альтернативы вы можете определить дополнительное ключевое слово tfirst в вызове odeint:

odeint(Burnout, y, t, args=p, tfirst=True)
...