2015-02-06 68 views
0

我對Python很新,所以請問如果下面的問題有一個'duh'的答案。在python中傳遞數組odeint

所以,我試圖解決ODE使用odeint並希望傳遞數組。但是,該類型錯誤:無法按類型「浮動」的非INT繁衍序列一直此起彼伏,在該行:

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 

一些幫助,請?

+1

在您的示例中,並未實際調用「deriv」。你能否改變你的示例代碼? – Carsten 2015-02-06 23:01:33

回答

0

立即解決問題是你deriv功能正試圖通過float值乘以普通的Python listCv_data(傳過來Cv)。如果要向量化此操作,請使用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]] 
+0

你好。本質上,每個給定時間點都有一個Cv值和一個Ap值,我希望odeint在每個時間點使用初始Ap值和相應的Cv和t值來求解Ap。 另外,謝謝你試圖幫助。我很感激。 我試着考慮你的建議,並得到一個錯誤(我將發佈的圖片作爲答案)。 – MacGuffin 2015-02-08 23:45:31

+0

我有點困惑:你似乎沒有在你的代碼中的任何地方使用'Ap_data'?它與你試圖解決的問題有什麼關係?在每種情況下,對於Cv和Ap的每個值,是否要使用相同的時間點解決同樣的方程6次? – xnx 2015-02-09 02:44:13

+0

你好。 Ap_data用於比較計算出的CA值和實驗值(在Ap_data中給出)。我將用它來計算方差,然後得到更好的參數估計值(它說代碼中的變化)。 是的,我希望爲CA解決6次問題,就像一個正常的ODE解算器一樣,在tdata中提及的時間點(以及Cv_data中的每個時間點的Cv)。 – MacGuffin 2015-02-11 15:35:40

0

嗯,事實證明,我不能張貼圖片,但(被新來的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