在python-odein中传递数组

2024-04-27 13:44:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python还不熟悉,如果下面的问题有一个“duh”的答案,请原谅我。在

所以,我尝试使用odeint来解决一个ODE,并希望传递一个数组。但是,TypeError:cannot multiply sequence by non int of type'float'不断出现在以下行中:

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

所以,代码是:

^{pr2}$

请帮忙?在


Tags: of答案bytype数组multiplyintode
2条回答

嗯,事实证明我还不能发布图像(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

您当前的问题是,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对于您给它的输入失败。。。在

^{pr2}$

也许你可以提供更多关于你的方程是什么以及它与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]]

相关问题 更多 >