2014-04-18 69 views
3

所以我试图解决三个ODE的系统,并开发了下面的代码来解决它们使用ODEint。但是当我运行时,ODEint有一个问题要求我的函数用于方程组。ODEINT无法调用功能

from scipy.integrate import odeint 



#initial parameters 
X0 = 75. 
M0 = 150. 
G0 = 105. 
N0 = 80. 
T0 = 7. 
u10 = 0.03
u20 = 0.0078947020 
u30 = 0.0010708464 
Rxg = 1.92 
Rxm = 3.84 
Rxma = 5.76 

#define system of equations 
def sugar(t,y,u10,u20,u30,Rxg,Rxm,Rxma): 
    ddt = [-u10*(X0+(Rxg*(G0-y[0]))+(Rxm*(M0-y[1]))+(Rxma*(N0-y[2]))), 
      -u20*(X0+(Rxg*(G0-y[0]))+(Rxm*(M0-y[1]))+(Rxma*(N0-y[2]))), 
      -u30*(X0+(Rxg*(G0-y[0]))+(Rxm*(M0-y[1]))+(Rxma*(N0-y[2])))] 
    return(ddt) 

#time parameter 
tinit = 0. 
tend = 10. 
h = 2. 
t = arange(tinit,tend+h,h) 

#initial guess 
y0 = [G0,M0,N0] 

#run odeint 
y = odeint(sugar,y0,t,args = (u10,u20,u30,Rxg,Rxm,Rxma)) 

print 't =',t 
print 'y =',y 

而且在我的输出获得:

t = [ 0. 2. 4. 6. 8. 10.] 
y = [[ 105. 150. 80.] 
[ 105. 150. 80.] 
[ 105. 150. 80.] 
[ 105. 150. 80.] 
[ 105. 150. 80.] 
[ 105. 150. 80.]] 
error: Error occurred while calling the Python function named sugar 

更改Y0和T仍然导致同样的错误的顺序。我不明白这个错误,也没有指导我解决这个问题。任何帮助将不胜感激。

+0

更改'y0'和't'的顺序仍导致相同的错误。 – user2855612

回答

0

the docs,为sugar签名应该是

func(y, t, ...) 

而不是

func(t, y ...) 

import numpy as np 
import scipy.integrate as integrate 

# initial parameters 
X0 = 75. 
M0 = 150. 
G0 = 105. 
N0 = 80. 
T0 = 7. 
u10 = 0.03
u20 = 0.0078947020 
u30 = 0.0010708464 
Rxg = 1.92 
Rxm = 3.84 
Rxma = 5.76 

# define system of equations 


def sugar(y, t, u10, u20, u30, Rxg, Rxm, Rxma): 
    ddt = [-u10 * (
     X0 + (Rxg * (G0 - y[0])) + (Rxm * (M0 - y[1])) + (Rxma * (N0 - y[2]))), 
     -u20 * (X0 + (Rxg * (G0 - y[0])) + (Rxm * (M0 - y[1])) + (
       Rxma * (N0 - y[2]))), 
     -u30 * (X0 + (Rxg * (G0 - y[0])) + (Rxm * (M0 - y[1])) + (Rxma * (N0 - y[2])))] 
    return ddt 

# time parameter 
tinit = 0. 
tend = 10. 
h = 2. 
t = np.arange(tinit, tend + h, h) 

# initial guess 
y0 = [G0, M0, N0] 

# run odeint 
y = integrate.odeint(sugar, y0, t, args=(u10, u20, u30, Rxg, Rxm, Rxma)) 

print('t = {t}'.format(t=t)) 
print('y = {y}'.format(y=y)) 

产生

t = [ 0. 2. 4. 6. 8. 10.] 
y = [[ 105.   150.   80.  ] 
[ 100.02722703 148.69673278 79.82322335] 
[ 94.02207128 147.12289808 79.60974661] 
[ 86.77020667 145.22232521 79.35195073] 
[ 78.01280485 142.92718027 79.04063465] 
[ 67.43730555 140.15554729 78.66468719]]