Generated Code

The following is python code generated by the CellML API from this CellML file. (Back to language selection)

The raw code is available.

# Size of variable arrays:
sizeAlgebraic = 40
sizeStates = 7
sizeConstants = 38
from math import *
from numpy import *

def createLegends():
    legend_states = [""] * sizeStates
    legend_rates = [""] * sizeStates
    legend_algebraic = [""] * sizeAlgebraic
    legend_voi = ""
    legend_constants = [""] * sizeConstants
    legend_voi = "time in component environment (second)"
    legend_states[0] = "V in component membrane (millivolt)"
    legend_constants[0] = "V_T in component membrane (millivolt)"
    legend_constants[1] = "V_S in component membrane (millivolt)"
    legend_constants[2] = "C_m in component membrane (mF_per_cm_squared)"
    legend_constants[3] = "F in component membrane (coulomb_per_mole)"
    legend_constants[4] = "R in component membrane (joule_per_mole_per_kelvin)"
    legend_constants[5] = "T in component membrane (kelvin)"
    legend_algebraic[16] = "I_leak in component I_leak (milliampere_per_cm_squared)"
    legend_algebraic[21] = "I_Na in component I_Na (milliampere_per_cm_squared)"
    legend_algebraic[22] = "I_KD in component I_KD (milliampere_per_cm_squared)"
    legend_algebraic[23] = "I_KM in component I_KM (milliampere_per_cm_squared)"
    legend_algebraic[25] = "I_CaL in component I_CaL (milliampere_per_cm_squared)"
    legend_algebraic[39] = "I_h in component I_h (milliampere_per_cm_squared)"
    legend_algebraic[11] = "I_app in component stimulus_protocol (milliampere_per_cm_squared)"
    legend_constants[6] = "i_stimStart in component stimulus_protocol (second)"
    legend_constants[7] = "i_stimEnd in component stimulus_protocol (second)"
    legend_constants[8] = "i_stimAmplitude in component stimulus_protocol (milliampere_per_cm_squared)"
    legend_algebraic[5] = "tau in component stimulus_protocol (second)"
    legend_constants[9] = "period in component stimulus_protocol (second)"
    legend_constants[10] = "g_leak in component I_leak (millisiemens_per_cm_squared)"
    legend_constants[11] = "E_leak in component I_leak (millivolt)"
    legend_constants[12] = "g_Na in component I_Na (millisiemens_per_cm_squared)"
    legend_constants[13] = "E_Na in component I_Na (millivolt)"
    legend_states[1] = "m in component Na_m_gate (dimensionless)"
    legend_states[2] = "h in component Na_h_gate (dimensionless)"
    legend_algebraic[0] = "alpha in component Na_m_gate (per_second)"
    legend_algebraic[6] = "beta in component Na_m_gate (per_second)"
    legend_algebraic[12] = "tau_m in component Na_m_gate (second)"
    legend_algebraic[17] = "m_inf in component Na_m_gate (dimensionless)"
    legend_algebraic[1] = "alpha_h in component Na_h_gate (per_second)"
    legend_algebraic[7] = "beta_h in component Na_h_gate (per_second)"
    legend_algebraic[18] = "h_inf in component Na_h_gate (dimensionless)"
    legend_algebraic[13] = "tau_h in component Na_h_gate (second)"
    legend_constants[14] = "g_KD in component I_KD (millisiemens_per_cm_squared)"
    legend_constants[15] = "E_K in component I_KD (millivolt)"
    legend_states[3] = "n in component KD_n_gate (dimensionless)"
    legend_algebraic[2] = "alpha_n in component KD_n_gate (per_second)"
    legend_algebraic[8] = "beta_n in component KD_n_gate (per_second)"
    legend_algebraic[14] = "tau_n in component KD_n_gate (second)"
    legend_algebraic[19] = "n_inf in component KD_n_gate (dimensionless)"
    legend_constants[16] = "g_KM in component I_KM (millisiemens_per_cm_squared)"
    legend_states[4] = "p in component KM_p_gate (dimensionless)"
    legend_algebraic[3] = "p_inf in component KM_p_gate (dimensionless)"
    legend_algebraic[9] = "tau_p in component KM_p_gate (second)"
    legend_constants[17] = "tau_max in component KM_p_gate (second)"
    legend_constants[18] = "P_Ca in component I_CaL (cm_per_second)"
    legend_algebraic[24] = "G in component G_nonlin (coulomb_per_cm_cubed)"
    legend_states[5] = "q in component CaL_q_gate (dimensionless)"
    legend_algebraic[4] = "alpha_q in component CaL_q_gate (per_second)"
    legend_algebraic[10] = "beta_q in component CaL_q_gate (per_second)"
    legend_algebraic[15] = "tau_q in component CaL_q_gate (second)"
    legend_algebraic[20] = "q_inf in component CaL_q_gate (dimensionless)"
    legend_constants[19] = "Z in component G_nonlin (dimensionless)"
    legend_constants[20] = "Ca_o in component G_nonlin (mM)"
    legend_states[6] = "Ca_i in component dCa_i_dt (mM)"
    legend_constants[21] = "Ca_inf in component dCa_i_dt (mM)"
    legend_constants[22] = "tau_r in component dCa_i_dt (second)"
    legend_constants[23] = "d in component dCa_i_dt (centimeter)"
    legend_algebraic[26] = "drive_channel in component dCa_i_dt (mM_per_second)"
    legend_constants[24] = "k in component dCa_i_dt (fixer)"
    legend_algebraic[38] = "m in component I_h (dimensionless)"
    legend_constants[25] = "E_h in component I_h (millivolt)"
    legend_constants[26] = "g_hbar in component I_h (millisiemens_per_cm_squared)"
    legend_constants[27] = "cac in component I_h (mM)"
    legend_constants[28] = "V_S in component I_h (millivolt)"
    legend_algebraic[35] = "o_1 in component kinetic (dimensionless)"
    legend_algebraic[36] = "o_2 in component kinetic (dimensionless)"
    legend_constants[29] = "g_inc in component I_h (dimensionless)"
    legend_algebraic[32] = "p_0 in component kinetic (dimensionless)"
    legend_algebraic[33] = "p_1 in component kinetic (dimensionless)"
    legend_algebraic[37] = "c_1 in component kinetic (dimensionless)"
    legend_algebraic[29] = "alpha in component rate_constants (dimensionless)"
    legend_algebraic[30] = "beta in component rate_constants (dimensionless)"
    legend_algebraic[31] = "k_1Ca in component rate_constants (per_second)"
    legend_constants[30] = "k_2 in component rate_constants (per_second)"
    legend_algebraic[34] = "k_3p in component rate_constants (per_second)"
    legend_constants[31] = "k_4 in component rate_constants (per_second)"
    legend_algebraic[27] = "h_inf in component rate_constants (second)"
    legend_algebraic[28] = "tau_s in component rate_constants (second)"
    legend_constants[32] = "P_c in component rate_constants (dimensionless)"
    legend_constants[33] = "n_Ca in component rate_constants (dimensionless)"
    legend_constants[34] = "n_exp in component rate_constants (dimensionless)"
    legend_constants[35] = "p_C in component rate_constants (dimensionless)"
    legend_constants[36] = "Ca_c in component rate_constants (mM)"
    legend_constants[37] = "tau_m in component rate_constants (second)"
    legend_rates[0] = "d/dt V in component membrane (millivolt)"
    legend_rates[1] = "d/dt m in component Na_m_gate (dimensionless)"
    legend_rates[2] = "d/dt h in component Na_h_gate (dimensionless)"
    legend_rates[3] = "d/dt n in component KD_n_gate (dimensionless)"
    legend_rates[4] = "d/dt p in component KM_p_gate (dimensionless)"
    legend_rates[5] = "d/dt q in component CaL_q_gate (dimensionless)"
    legend_rates[6] = "d/dt Ca_i in component dCa_i_dt (mM)"
    return (legend_states, legend_algebraic, legend_voi, legend_constants)

def initConsts():
    constants = [0.0] * sizeConstants; states = [0.0] * sizeStates;
    states[0] = -70
    constants[0] = -55
    constants[1] = 0
    constants[2] = 1e-3
    constants[3] = 96489
    constants[4] = 8.314
    constants[5] = 296.65
    constants[6] = 5
    constants[7] = 9
    constants[8] = -0.3
    constants[9] = 9
    constants[10] = 1
    constants[11] = -70
    constants[12] = 70
    constants[13] = 50
    states[1] = 0
    states[2] = 0
    constants[14] = 7
    constants[15] = -95
    states[3] = 0
    constants[16] = 0.004
    states[4] = 0
    constants[17] = 4
    constants[18] = 2.76e-4
    states[5] = 0.00247262
    constants[19] = 2
    constants[20] = 2
    states[6] = 100e-6
    constants[21] = 100e-6
    constants[22] = 17e-3
    constants[23] = 1e-4
    constants[24] = 0.1
    constants[25] = -20
    constants[26] = 0.02
    constants[27] = 0.006
    constants[28] = 0
    constants[29] = 2
    constants[30] = 0.1
    constants[31] = 1
    constants[32] = 0.01
    constants[33] = 4
    constants[34] = 1
    constants[35] = 0.01
    constants[36] = 0.006
    constants[37] = 20e-3
    return (states, constants)

def computeRates(voi, states, constants):
    rates = [0.0] * sizeStates; algebraic = [0.0] * sizeAlgebraic
    algebraic[3] = custom_piecewise([less(-(states[0]+35.0000)/10.0000 , 25.0000) & greater(-(states[0]+35.0000)/10.0000 , -25.0000), 1.00000/(1.00000+exp(-(states[0]+35.0000)/10.0000)) , True, 1.00000])
    algebraic[9] = custom_piecewise([less((states[0]+35.0000)/20.0000 , 25.0000) & greater((states[0]+35.0000)/20.0000 , -25.0000), constants[17]/(3.30000*exp((states[0]+35.0000)/20.0000)+exp(-(states[0]+35.0000)/20.0000)) , True, 1.00000])
    rates[4] = (algebraic[3]-states[4])/algebraic[9]
    algebraic[0] = custom_piecewise([less(fabs(((13.0000+constants[0])-states[0])/4.00000) , 1.00000e-06), 0.320000*4.00000*(1.00000-((13.0000+constants[0])-states[0])/(2.00000*4.00000)) , True, (0.320000*((13.0000+constants[0])-states[0]))/(exp(((13.0000+constants[0])-states[0])/4.00000)-1.00000)])
    algebraic[6] = custom_piecewise([less(fabs(-((states[0]-constants[0])-40.0000)/5.00000) , 1.00000e-06), -0.280000*5.00000*(1.00000--((states[0]-constants[0])-40.0000)/(2.00000*5.00000)) , True, (-0.280000*((states[0]-constants[0])-40.0000))/(exp(-((states[0]-constants[0])-40.0000)/5.00000)-1.00000)])
    algebraic[12] = 1.00000/(algebraic[0]+algebraic[6])
    algebraic[17] = algebraic[0]/(algebraic[0]+algebraic[6])
    rates[1] = (algebraic[17]-states[1])/algebraic[12]
    algebraic[1] = 0.128000*exp(((17.0000+constants[0]+constants[1])-states[0])/18.0000)
    algebraic[7] = 4.00000/(1.00000+exp(((40.0000+constants[1]+constants[0])-states[0])/5.00000))
    algebraic[18] = algebraic[1]/(algebraic[1]+algebraic[7])
    algebraic[13] = 1.00000/(algebraic[1]+algebraic[7])
    rates[2] = (algebraic[18]-states[2])/algebraic[13]
    algebraic[2] = custom_piecewise([less(fabs(((states[0]-constants[0])-15.0000)/5.00000) , 1.00000e-06), -0.0320000*5.00000*(1.00000-((states[0]-constants[0])-15.0000)/(2.00000*5.00000)) , True, (-0.0320000*((states[0]-constants[0])-15.0000))/(exp(((states[0]-constants[0])-15.0000)/5.00000)-1.00000)])
    algebraic[8] = custom_piecewise([less(fabs(-((states[0]-constants[0])-10.0000)/40.0000) , 1.00000e-06), 0.500000*40.0000*(1.00000+((states[0]-constants[0])-10.0000)/(2.00000*40.0000)) , True, (0.500000*-((states[0]-constants[0])-10.0000))/(exp(-((states[0]-constants[0])-10.0000)/40.0000)-1.00000)])
    algebraic[14] = 1.00000/(algebraic[2]+algebraic[8])
    algebraic[19] = algebraic[2]/(algebraic[2]+algebraic[8])
    rates[3] = (algebraic[19]-states[3])/algebraic[14]
    algebraic[4] = 6.32000/(1.00000+exp(-(states[0]-5.00000)/13.8900))
    algebraic[10] = custom_piecewise([less(fabs((1.31000-states[0])/5.36000) , 1.00000e-06), 0.0200000*(5.36000+(1.31000-states[0])/2.00000) , True, (0.0200000*(1.31000-states[0]))/(1.00000-exp((states[0]-1.31000)/5.36000))])
    algebraic[15] = 1.00000/(algebraic[4]+algebraic[10])
    algebraic[20] = 1.00000/(1.00000+exp((states[0]+10.0000)/-10.0000))
    rates[5] = (algebraic[20]-states[5])/algebraic[15]
    algebraic[24] = ((((power(constants[19], 2.00000))*(power(constants[3], 2.00000))*0.00100000*states[0])/(constants[4]*constants[5]))*1.00000e-06*(states[6]-constants[20]*exp((constants[19]*constants[3]*0.00100000*states[0])/(constants[4]*constants[5]))))/(1.00000-exp((0.00100000*constants[19]*constants[3]*states[0])/(constants[4]*constants[5])))
    algebraic[25] = 1000.00*constants[18]*(power(states[5], 2.00000))*algebraic[24]
    algebraic[26] = (constants[24]*algebraic[25])/(2.00000*constants[3]*constants[23])
    rates[6] = custom_piecewise([less_equal(algebraic[26] , 0.00000), (constants[21]-states[6])/constants[22] , True, algebraic[26]+(constants[21]-states[6])/constants[22]])
    algebraic[16] = 1000.00*constants[10]*(states[0]-constants[11])
    algebraic[21] = 1000.00*constants[12]*(power(states[1], 3.00000))*states[2]*(states[0]-constants[13])
    algebraic[22] = 1000.00*constants[14]*(power(states[3], 4.00000))*(states[0]-constants[15])
    algebraic[23] = 1000.00*constants[16]*states[4]*(states[0]-constants[15])
    algebraic[27] = 1.00000/(1.00000+exp(((states[0]+75.0000)-constants[28])/5.50000))
    algebraic[28] = constants[37]+1000.00/(exp(((states[0]+71.5500)-constants[28])/14.2000)+exp(-((states[0]+89.0000)-constants[28])/11.6000))
    algebraic[29] = algebraic[27]/algebraic[28]
    algebraic[30] = (1.00000-algebraic[27])/algebraic[28]
    algebraic[31] = constants[30]*(power(states[6]/constants[36], constants[33]))
    rootfind_0(voi, constants, rates, states, algebraic)
    algebraic[34] = constants[31]*(power(algebraic[33]/constants[35], constants[34]))
    rootfind_1(voi, constants, rates, states, algebraic)
    algebraic[38] = algebraic[35]+constants[29]+algebraic[36]
    algebraic[39] = 1000.00*constants[26]*algebraic[38]*(states[0]-constants[25])
    algebraic[5] = voi-constants[9]*floor(voi/constants[9])
    algebraic[11] = custom_piecewise([greater_equal(algebraic[5] , constants[6]) & less_equal(algebraic[5] , constants[7]), constants[8] , True, 0.00000])
    rates[0] = (0.00100000*((((((algebraic[11]+-algebraic[16])-algebraic[21])-algebraic[22])-algebraic[23])-algebraic[25])-algebraic[39]))/constants[2]
    return(rates)

def computeAlgebraic(constants, states, voi):
    algebraic = array([[0.0] * len(voi)] * sizeAlgebraic)
    states = array(states)
    voi = array(voi)
    algebraic[3] = custom_piecewise([less(-(states[0]+35.0000)/10.0000 , 25.0000) & greater(-(states[0]+35.0000)/10.0000 , -25.0000), 1.00000/(1.00000+exp(-(states[0]+35.0000)/10.0000)) , True, 1.00000])
    algebraic[9] = custom_piecewise([less((states[0]+35.0000)/20.0000 , 25.0000) & greater((states[0]+35.0000)/20.0000 , -25.0000), constants[17]/(3.30000*exp((states[0]+35.0000)/20.0000)+exp(-(states[0]+35.0000)/20.0000)) , True, 1.00000])
    algebraic[0] = custom_piecewise([less(fabs(((13.0000+constants[0])-states[0])/4.00000) , 1.00000e-06), 0.320000*4.00000*(1.00000-((13.0000+constants[0])-states[0])/(2.00000*4.00000)) , True, (0.320000*((13.0000+constants[0])-states[0]))/(exp(((13.0000+constants[0])-states[0])/4.00000)-1.00000)])
    algebraic[6] = custom_piecewise([less(fabs(-((states[0]-constants[0])-40.0000)/5.00000) , 1.00000e-06), -0.280000*5.00000*(1.00000--((states[0]-constants[0])-40.0000)/(2.00000*5.00000)) , True, (-0.280000*((states[0]-constants[0])-40.0000))/(exp(-((states[0]-constants[0])-40.0000)/5.00000)-1.00000)])
    algebraic[12] = 1.00000/(algebraic[0]+algebraic[6])
    algebraic[17] = algebraic[0]/(algebraic[0]+algebraic[6])
    algebraic[1] = 0.128000*exp(((17.0000+constants[0]+constants[1])-states[0])/18.0000)
    algebraic[7] = 4.00000/(1.00000+exp(((40.0000+constants[1]+constants[0])-states[0])/5.00000))
    algebraic[18] = algebraic[1]/(algebraic[1]+algebraic[7])
    algebraic[13] = 1.00000/(algebraic[1]+algebraic[7])
    algebraic[2] = custom_piecewise([less(fabs(((states[0]-constants[0])-15.0000)/5.00000) , 1.00000e-06), -0.0320000*5.00000*(1.00000-((states[0]-constants[0])-15.0000)/(2.00000*5.00000)) , True, (-0.0320000*((states[0]-constants[0])-15.0000))/(exp(((states[0]-constants[0])-15.0000)/5.00000)-1.00000)])
    algebraic[8] = custom_piecewise([less(fabs(-((states[0]-constants[0])-10.0000)/40.0000) , 1.00000e-06), 0.500000*40.0000*(1.00000+((states[0]-constants[0])-10.0000)/(2.00000*40.0000)) , True, (0.500000*-((states[0]-constants[0])-10.0000))/(exp(-((states[0]-constants[0])-10.0000)/40.0000)-1.00000)])
    algebraic[14] = 1.00000/(algebraic[2]+algebraic[8])
    algebraic[19] = algebraic[2]/(algebraic[2]+algebraic[8])
    algebraic[4] = 6.32000/(1.00000+exp(-(states[0]-5.00000)/13.8900))
    algebraic[10] = custom_piecewise([less(fabs((1.31000-states[0])/5.36000) , 1.00000e-06), 0.0200000*(5.36000+(1.31000-states[0])/2.00000) , True, (0.0200000*(1.31000-states[0]))/(1.00000-exp((states[0]-1.31000)/5.36000))])
    algebraic[15] = 1.00000/(algebraic[4]+algebraic[10])
    algebraic[20] = 1.00000/(1.00000+exp((states[0]+10.0000)/-10.0000))
    algebraic[24] = ((((power(constants[19], 2.00000))*(power(constants[3], 2.00000))*0.00100000*states[0])/(constants[4]*constants[5]))*1.00000e-06*(states[6]-constants[20]*exp((constants[19]*constants[3]*0.00100000*states[0])/(constants[4]*constants[5]))))/(1.00000-exp((0.00100000*constants[19]*constants[3]*states[0])/(constants[4]*constants[5])))
    algebraic[25] = 1000.00*constants[18]*(power(states[5], 2.00000))*algebraic[24]
    algebraic[26] = (constants[24]*algebraic[25])/(2.00000*constants[3]*constants[23])
    algebraic[16] = 1000.00*constants[10]*(states[0]-constants[11])
    algebraic[21] = 1000.00*constants[12]*(power(states[1], 3.00000))*states[2]*(states[0]-constants[13])
    algebraic[22] = 1000.00*constants[14]*(power(states[3], 4.00000))*(states[0]-constants[15])
    algebraic[23] = 1000.00*constants[16]*states[4]*(states[0]-constants[15])
    algebraic[27] = 1.00000/(1.00000+exp(((states[0]+75.0000)-constants[28])/5.50000))
    algebraic[28] = constants[37]+1000.00/(exp(((states[0]+71.5500)-constants[28])/14.2000)+exp(-((states[0]+89.0000)-constants[28])/11.6000))
    algebraic[29] = algebraic[27]/algebraic[28]
    algebraic[30] = (1.00000-algebraic[27])/algebraic[28]
    algebraic[31] = constants[30]*(power(states[6]/constants[36], constants[33]))
    algebraic[34] = constants[31]*(power(algebraic[33]/constants[35], constants[34]))
    algebraic[38] = algebraic[35]+constants[29]+algebraic[36]
    algebraic[39] = 1000.00*constants[26]*algebraic[38]*(states[0]-constants[25])
    algebraic[5] = voi-constants[9]*floor(voi/constants[9])
    algebraic[11] = custom_piecewise([greater_equal(algebraic[5] , constants[6]) & less_equal(algebraic[5] , constants[7]), constants[8] , True, 0.00000])
    return algebraic

initialGuess0 = None
def rootfind_0(voi, constants, rates, states, algebraic):
    """Calculate values of algebraic variables for DAE"""
    from scipy.optimize import fsolve
    global initialGuess0
    if initialGuess0 is None: initialGuess0 = ones(2)*0.1
    if not iterable(voi):
        soln = fsolve(residualSN_0, initialGuess0, args=(algebraic, voi, constants, rates, states), xtol=1E-6)
        initialGuess0 = soln
        algebraic[32] = soln[0]
        algebraic[33] = soln[1]
    else:
        for (i,t) in enumerate(voi):
            soln = fsolve(residualSN_0, initialGuess0, args=(algebraic[:,i], voi[i], constants, rates[:i], states[:,i]), xtol=1E-6)
            initialGuess0 = soln
            algebraic[32][i] = soln[0]
            algebraic[33][i] = soln[1]

def residualSN_0(algebraicCandidate, algebraic, voi, constants, rates, states):
    resid = array([0.0] * 2)
    algebraic[32] = algebraicCandidate[0]
    algebraic[33] = algebraicCandidate[1]
    resid[0] = (algebraic[32]-(algebraic[33]*constants[30])/algebraic[31])
    resid[1] = (algebraic[33]-(1.00000-algebraic[32]))
    return resid

initialGuess1 = None
def rootfind_1(voi, constants, rates, states, algebraic):
    """Calculate values of algebraic variables for DAE"""
    from scipy.optimize import fsolve
    global initialGuess1
    if initialGuess1 is None: initialGuess1 = ones(3)*0.1
    if not iterable(voi):
        soln = fsolve(residualSN_1, initialGuess1, args=(algebraic, voi, constants, rates, states), xtol=1E-6)
        initialGuess1 = soln
        algebraic[35] = soln[0]
        algebraic[36] = soln[1]
        algebraic[37] = soln[2]
    else:
        for (i,t) in enumerate(voi):
            soln = fsolve(residualSN_1, initialGuess1, args=(algebraic[:,i], voi[i], constants, rates[:i], states[:,i]), xtol=1E-6)
            initialGuess1 = soln
            algebraic[35][i] = soln[0]
            algebraic[36][i] = soln[1]
            algebraic[37][i] = soln[2]

def residualSN_1(algebraicCandidate, algebraic, voi, constants, rates, states):
    resid = array([0.0] * 3)
    algebraic[35] = algebraicCandidate[0]
    algebraic[36] = algebraicCandidate[1]
    algebraic[37] = algebraicCandidate[2]
    resid[0] = (algebraic[37]-(algebraic[30]/algebraic[29])*algebraic[35])
    resid[1] = (algebraic[35]-(constants[31]/algebraic[34])*algebraic[36])
    resid[2] = (algebraic[36]-((1.00000-algebraic[37])-algebraic[35]))
    return resid

def custom_piecewise(cases):
    """Compute result of a piecewise function"""
    return select(cases[0::2],cases[1::2])

def solve_model():
    """Solve model with ODE solver"""
    from scipy.integrate import ode
    # Initialise constants and state variables
    (init_states, constants) = initConsts()

    # Set timespan to solve over
    voi = linspace(0, 10, 500)

    # Construct ODE object to solve
    r = ode(computeRates)
    r.set_integrator('vode', method='bdf', atol=1e-06, rtol=1e-06, max_step=1)
    r.set_initial_value(init_states, voi[0])
    r.set_f_params(constants)

    # Solve model
    states = array([[0.0] * len(voi)] * sizeStates)
    states[:,0] = init_states
    for (i,t) in enumerate(voi[1:]):
        if r.successful():
            r.integrate(t)
            states[:,i+1] = r.y
        else:
            break

    # Compute algebraic variables
    algebraic = computeAlgebraic(constants, states, voi)
    return (voi, states, algebraic)

def plot_model(voi, states, algebraic):
    """Plot variables against variable of integration"""
    import pylab
    (legend_states, legend_algebraic, legend_voi, legend_constants) = createLegends()
    pylab.figure(1)
    pylab.plot(voi,vstack((states,algebraic)).T)
    pylab.xlabel(legend_voi)
    pylab.legend(legend_states + legend_algebraic, loc='best')
    pylab.show()

if __name__ == "__main__":
    (voi, states, algebraic) = solve_model()
    plot_model(voi, states, algebraic)