Передать массив в Python odeint

Я новичок в Python, поэтому извините меня, если на следующий вопрос есть ответ «дух».

Итак, я пытаюсь решить ODE с помощью odeint и хочу передать массив. Но TypeError: не может умножать последовательность на не-int типа 'float', продолжает появляться в строке:

CA0 = (-kd-kn*Cv)*CAi/(1+(CAi/ks))

Итак, код:

from scipy.integrate import odeint
import numpy as np

Ap_data = [2, 7, 91, 1.6, 0.4, 5]
tdata= [0, 1, 4, 5, 4, 20]
Cv_data = [43, 580, 250, 34, 30, 3]

#Define parameters
kn = 1E-5 #change 
ks = 1E+5 #change
kd = 0.058  

def deriv (CAi,t, Cv):
    CA0 = (-kd-kn*Cv)*CAi/(1+(CAi/ks))
    return CA0

#Initial conditions
CA_init = 21.6

#Solve the ODE
(CAb_soln) = odeint (derivCAb, CA_init, tdata, (Cv_data,))

print CAb_soln

Некоторая помощь, пожалуйста?


person MacGuffin    schedule 06.02.2015    source источник
comment
В вашем примере deriv на самом деле не вызывается. Не могли бы вы изменить код примера?   -  person Carsten    schedule 07.02.2015


Ответы (2)


Ваша непосредственная проблема заключается в том, что ваша функция deriv пытается умножить обычные значения Python list, Cv_data (переданные как Cv) на значения float. Если вы хотите векторизовать эту операцию, используйте массивы NumPy:

Ap_data = np.array([2, 7, 91, 1.6, 0.4, 5])
tdata= np.array([0, 1, 4, 5, 4, 20])
Cv_data = np.array([43, 580, 250, 34, 30, 3])

решить это. Теперь у вас есть проблема, что odeint терпит неудачу для ввода, который вы ему даете...

 intdy--  t (=r1) illegal      
      in above message,  r1 =  0.4000000000000D+01
      t not in interval tcur - hu (= r1) to tcur (=r2)       
      in above,  r1 =  0.4287484688360D+01   r2 =  0.5551311182627D+01
 lsoda--  trouble from intdy. itask = i1, tout = r1ls
      in above message,  i1 =         1
      in above message,  r1 =  0.4000000000000D+01
Illegal input detected (internal error).
Run with full_output = 1 to get quantitative information.
[[ 21.6       ]
 [ 20.37432613]
 [ 17.09897165]
 [ 16.12866355]
 [ 16.12866355]
 [ -0.90614016]]

Возможно, вы можете дать больше информации о том, что представляет собой ваше уравнение и как оно связано с Cv_data. В частности, ваша производная не зависит от t, но у вас есть диапазон значений этого параметра, Cv.

ОБНОВЛЕНИЕ: Это не удается из-за вашего забавного временного ряда. odeint работает правильно, если он монотонный, например:

from scipy.integrate import odeint
import numpy as np

Ap_data = [2, 7, 91, 1.6, 0.4, 5]
tdata= np.array([0, 1, 4, 5, 10, 20])
Cv_data = np.array([43, 580, 250, 34, 30, 3])

#Define parameters
kn = 1E-5 #change 
ks = 1E+5 #change
kd = 0.058  

def deriv (CAi,t, Cv):
    CA0 = (-kd-kn*Cv)*CAi/(1+(CAi/ks))
    return CA0

#Initial conditions
CA_init = 21.6

#Solve the ODE
(CAb_soln) = odeint (deriv, CA_init, tdata, (Cv_data,))
print CAb_soln

Результат:

[[ 21.6       ]
 [ 20.37432613]
 [ 17.09897165]
 [ 16.12866355]
 [ 12.04306424]
 [  6.71431758]]
person xnx    schedule 06.02.2015
comment
Привет. По сути, существует значение Cv и значение Ap для каждого заданного момента времени, и я хочу, чтобы odeint находил Ap в каждый момент времени, используя начальное значение Ap и соответствующие значения Cv и t. Также спасибо, что пытаетесь помочь. Я ценю это. Я попытался учесть ваше предложение и получил ошибку (изображение которой я опубликую в качестве ответа). - person MacGuffin; 09.02.2015
comment
Я немного смущен: кажется, вы нигде в своем коде не используете Ap_data? Как это связано с проблемой, которую вы пытаетесь решить? Вы хотите решить одно и то же уравнение 6 раз для каждого значения Cv и Ap, используя одни и те же моменты времени в каждом случае? - person xnx; 09.02.2015
comment
Привет. Ap_data предназначен для сравнения рассчитанных значений CA с экспериментальными (которые приведены в Ap_data). Я буду использовать его для расчета дисперсии, а затем получить более точные оценки параметров (где в коде указано изменение). И да, я хочу решить шесть раз для CA, как обычный решатель ODE, с временными точками, указанными в tdata (и Cv для каждого из Cv_data). - person MacGuffin; 11.02.2015
comment
Видите обновление? Я думаю, проблема была с вашим временным рядом. - person xnx; 11.02.2015
comment
Вау. Это блестяще! Огромное спасибо. Не буду впредь копаться в смешных временных массивах. - person MacGuffin; 12.02.2015
comment
Рад, что помог. Не стесняйтесь принять ответ :) - person xnx; 13.02.2015

Ну, как оказалось, я пока не могу опубликовать изображение (я новичок в stackoverflow). Итак, код, который я использовал, был-

from scipy.integrate import odeint
import numpy as np

Ap_data = np.array([2, 7, 91, 1.6, 0.4, 5])
tdata= [0, 1, 4, 5, 4, 20]
Cv_data = np.array([43, 580, 250, 34, 30, 3])

#Define parameters
kn = 1E-5 #change 
ks = 1E+5 #change
kd = 0.058  

def deriv (CAi,t, Cv):
    CA0 = (-kd-kn*Cv)*CAi/(1+(CAi/ks))
    return CA0

#Initial conditions
CA_init = 21.6

#Solve the ODE
(CAb_soln) = odeint (deriv, CA_init, tdata, (Cv_data,), full_output=True)

print CAb_soln
person MacGuffin    schedule 08.02.2015