Question

so I am attempting to solve a system of three ODEs and developed the following code to solve them using ODEint. But when I run, ODEint has an issue calling on my function for the system of equations.

from scipy.integrate import odeint



#initial parameters
X0 = 75.
M0 = 150.
G0 = 105.
N0 = 80.
T0 = 7.
u10 = 0.0301231859
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

And in my output I get:

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

Changing the order of y0 and t still results in the same error. I do not understand the error nor does it guide me to the issue. Any help would be greatly appreciated.

Was it helpful?

Solution

Per the docs, the signature for sugar should be

func(y, t, ...)

rather than

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.0301231859
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))

yields

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]]
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top