在 python odeint 中传递一个数组

Pass an array in python odeint

我是 Python 的新手,如果以下问题有 'duh' 答案,请多多包涵。

所以,我正在尝试使用 odeint 求解 ODE 并希望传递一个数组。但是,TypeError: can't multiply sequence by non-int of type '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

有什么帮助吗?

您的直接问题是您的 deriv 函数试图将普通的 Python listCv_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]]

好吧,事实证明我还不能 post 图片(我是 Whosebug 的新手)。所以,我使用的代码是-

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