1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
| #!/usr/bin/env python
# -*- coding: utf-8 -*-
from math import exp
import numpy as np
from scipy.integrate import odeint
# main documentation
# PEP 8: http://legacy.python.org/dev/peps/pep-0008/
# Constantes
# cf http://legacy.python.org/dev/peps/pep-0008/#constants
K_GEL1 = 5.7e31
K_GEL2 = 3.1e14
K_GLC = 0.023
K_GLC2 = 2.9e-8
K_ALPHAMAL = 0.389
K_BETAMAL = 0.137
K_ALPHAMAL2 = 1.2e-7
K_BETAMAL2 = 8.4e-8
K_MLT = 0.117
K_MLT2 = 1.5e-8
K_DEX = 0.317
K_DEGALPHA = 6.9e30
E_DEGALPHA = 224.2
K_DEGBETA = 7.6e60
E_DEGBETA = 410.7
# fonctions
# cf http://legacy.python.org/dev/peps/pep-0008/#function-names
def temperature_profile (timeandtemp, t):
"""
décrivez dans ce docstring ce que fait cette fonction
e.g.
ajustement du profil température en fct d'un abaque
@timeandtemp et d'un instant @t;
"""
# inits
t = abs(float(t))
tt00 = float(timeandtemp[0][0])
tt01 = float(timeandtemp[0][1])
tt10 = float(timeandtemp[1][0])
tt11 = float(timeandtemp[1][1])
if not t:
T = 55.0
elif t < 9.0:
T = 55.0 + t
elif t <= 9.0 + tt00:
T = tt01
elif t < 17.0 + tt00:
T = tt01 + t
elif t <= 17.0 + tt00 + tt01:
T = tt11
elif t < 23.0 + tt00 + tt10:
T = tt11 + t
else:
T = float(timeandtemp[2][1])
# end if
return float(273.15 + T)
# end def
def flux (ci, temperature):
"""
décrivez dans ce docstring ce que fait votre fonction
e.g.
calcul de profil de flux bla bla bla
"""
# inits
starchUG, starchG, glc, mal, mlt, dex, enzA, enzB = ci
th = temperature
# Relative activities
if th < 336.15:
a_alpha = -0.0011*th**3 + 1.091*th**2 - 352.89*th + 38008.3
a_beta = 0.049*th - 13.9
else:
a_alpha = 0.0055*th**3 - 5.663*th**2 + 1941.9*th - 221864
a_beta = 0.374*th + 128.3
# end if
# Equations
if th < 333.15:
r_gel = K_GEL1 * starchUG
else:
r_gel = K_GEL2 * starchUG
# end if
r_glc = K_GLC * a_alpha * glc
r_mal = (K_ALPHAMAL*a_alpha + K_BETAMAL*a_beta) * starchG
r_mlt = K_MLT * a_alpha * starchG
r_dex = K_DEX * a_alpha * starchG
r_glc2 = K_GLC2 * a_alpha * dex
r_mal2 = K_ALPHAMAL2*a_alpha*dex + K_BETAMAL2*a_beta*dex
r_mlt2 = K_MLT2 * a_alpha * dex
r_degA = K_DEGALPHA * exp(-E_DEGALPHA/(8.3145*th)) * enzA
r_degB = K_DEGBETA * exp(-E_DEGBETA/(8.3145*th)) * enzB
r_acA = K_DEGALPHA * exp(-E_DEGALPHA/(8.3145*th)) * a_alpha * enzA
r_acB = K_DEGBETA * exp(-E_DEGBETA/(8.3145*th)) * a_beta * enzB
return np.array(
[r_glc, r_mal, r_mlt, r_dex, r_glc2, r_mal2, r_mlt2, r_degA,
r_degB, r_acA, r_acB]
)
# end def
def sec_membre (ci, t, tempProf):
"""
décrivez dans ce docstring ce que fait votre fonction
e.g.
calcul de bla bla bla
"""
# inits
temperature = temperature_profile(tempProf, t)
mS = np.mat([
[-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[ 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0],
[ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0],
[ 0, 0, 0, 0, 1, -1, -1, -1, 0, 0, 0],
])
mS = np.transpose(mS)
mS = np.array(mS)
metabos = flux(ci, temperature)
varMetabos = np.dot(metabos, mS)
return varMetabos
# end def
# Initial conditions
initCond = np.array([113.5, 0, 4, 5, 0, 0, 80000, 80000])
# Temperature steps in minutes
ts = temperature_steps = ((30, 64), (30, 72), (5, 78))
t0 = 0
tf = ts[0][0] + ts[1][0] + ts[2][0] + 23
nbPoints = 100
timeProfile = np.linspace(t0, tf, nbPoints)
print "\ntime profile:\n", timeProfile
print "\nrunning odeint():"
result = odeint(sec_membre, initCond, timeProfile, args=(temperature_steps,))
print "\nresult:\n", result |
Partager