Soit un système dont l'évolution temporelle est régie par une équation différentielle du type :
\begin{align} \mathsf{ \frac{d[A]}{dt} + k[A] = 0 \\ } \end{align}La méthode d'Euler, qui permet d'intégrer cette équation différentielle, utilise la formule de Taylor :
\begin{equation} \mathsf{ f(t_0+h) = f(t_0)+ h \cdot \left(\frac{df}{dt}\right)_{t_0} {\text{si h}} \to 0 } \end{equation}Cette relation permet donc de calculer la concentration d'une espèce à un instant $\mathsf{t_0+h}$ connaissant la valeur de cette concentration à l'instant $\mathsf{t_0}$ et la valeur de la dérivée de cette concentration à l'instant $\mathsf{t_0}$.
Par exemple, pour la concentration de l'espèce $A$ :
\begin{equation} \mathsf{[A]_{t_0+h}=[A]_{t_0}+ \left(\frac{d[A]}{dt}\right)_{t=t_0} \cdot h} \end{equation}L'expression de la dérivée $\mathsf{\frac{d[A]}{dt}}$ s'obtient à partir de l'équation différentielle :
\begin{equation} \mathsf{ \frac{d[A]}{dt} =- k[A] } \end{equation}ce qui permet de calculer la valeur de la concentration $\mathsf{[A]_{t_0+h}}$ à partir de $\mathsf{[A]_{t_0}}$ :
\begin{equation} \mathsf{ [A]_{t_0+h} = [A]_{t_0} -k[A]_{t_0} \cdot h } \end{equation}La méthode d'Euler nécessite :
En outre, sur le plan chimique, les concentrations des réactifs ne peuvent devenir négatives, ce qui impose une condition supplémentaire dans la boucle de calcul.
La bibliothèque matplolib
est utilisée ici pour tracer le graphique de la concentration $\mathsf{[A]}$ en fonction du temps.
D'autre part, pour valider le résultat de cette méthode d'intégration numérique, la courbe représentant la solution analytique est ajoutée au graphique. Le tracé de cette fonction nécessite l'utilisation de la bibliothèque math
ou numpy
.
Les paramètres suivants peuvent être modifiés :
import matplotlib.pyplot as plt
from math import exp
"""Conditions initiales"""
a=1 # en mol/L
"""Paramètres de la méthode d'intégration"""
h=0.001 # en s
duree = 1 # en s
"""Valeurs des constantes de vitesse"""
k=10 # en s^(-1)
"""Listes des valeurs calculées des concentrations"""
LT=[0] # liste des instants t
LA=[a] # liste des concentrations successives de A
""" Boucle d'intégration"""
nbpts =duree/h
i=1
while i<=nbpts and LA[-1] >= 0 :
A=LA[-1]
LT.append(i*h)
LA.append(A - k*A*h)
i=i+1
"""Liste de valeurs issues de la solution analytique"""
A_litt = [a * exp(-k*t) for t in LT]
"""Tracé des courbes des concentrations calculées en fonction du temps"""
plt.figure(1)
plt.plot(LT,LA,'b--', label='A Euler')
plt.plot(LT,A_litt,'g--', label='A littéral')
plt.xlabel('t en s')
plt.ylabel('Concentrations en $mol.L^{-1}$')
plt.title(f"Intégration par la méthode d'Euler : k = {k} s^(-1) et pas de calcul h = {h} s")
plt.legend()
plt.grid()
plt.show()
Le choix d'un pas de calcul trop grand (par exemple, $\mathsf{\mathsf{h=1s}}$) entraîne un écart non négligeable entre la solution analytique et la solution numérique.
En revanche, l'utilisation d'un pas $\mathsf{h}$ trop petit peut engendrer des durées de calcul très importantes.
Soit une transformation chimique impliquant deux espèces réactives, $A$ et $B$ dont l'équation de réaction s'écrit : \begin{align} \mathsf{ A + B = C \\ } \end{align}
En supposant que la loi de vitesse s'écrive $\mathsf{ v = k[A][B]^2 }$, l'évolution temporelle de la concentration $\mathsf{[A]}$ est régie par l'équation différentielle : \begin{align} \mathsf{ -\frac{d[A]}{dt} = k[A][B]^2 \\ } \end{align}
En l'absence de simplification de la loi de vitesse induite par les conditions expérimentales, le recours à la méthode d'Euler permet d'intégrer numériquement cette équation différentielle, en calculant de manière itérative, les valeurs successives de la concentration $\mathsf{[A]}$ : \begin{equation} \mathsf{ [A]_{t_0+h} = [A]_{t_0} + h \cdot \left( \frac{d[A]}{dt} \right)_{t_0} \\ A]_{t_0+h} = [A]_{t_0} - h \cdot k[A]_{t_0}[B]_{t_0}^2 \\ } \end{equation}
Cette équation montre la nécessité de connaître également les valeurs successives de la concentration [B]. Celle-ci est obtenue au moyen d'un bilan de matière (tableau d'avancement) : \begin{equation} \mathsf{ [A]_{t} = [A]_{0} - x \Rightarrow x = [A]_{0} - [A]_{t} \\ [B]_{t} = [B]_{0} - x \Rightarrow [B]_{t} = [B]_{0} + [A]_{t} - [A]_{0} \\ } \end{equation}
Enfin, la méthode permet également de déterminer sans difficulté, l'évolution de la concentration en produit $\mathsf{C}$ de la transformation.
Les paramètres suivants peuvent être modifiés :
import matplotlib.pyplot as plt
"""Conditions initiales"""
a=.1 # en mol/L
b=.08
c=0
"""Paramètres de la méthode d'intégration"""
h=0.001 # en s
duree = 1 # en s
"""Valeurs des constantes de vitesse"""
k=100 # en s^(-1)
"""Listes des valeurs calculées des concentrations"""
LT=[0] # liste des instants t
LA=[a] # liste des concentrations successives de A
LB=[b] # liste des concentrations successives de B
LC=[c] # liste des concentrations successives de C
""" Boucle d'intégration"""
nbpts =duree/h
i=1
while i <= nbpts and LA[-1] >= 0 and LB[-1] >= 0 :
LT.append(i*h)
LA.append(LA[-1] - k*LA[-1]*LB[-1]*h)
LB.append(b - a + LA[-1])
LC.append(c + a - LA[-1])
i=i+1
"""Tracé des courbes des concentrations calculées en fonction du temps"""
plt.figure(1)
plt.plot(LT,LA,'b--', label='réactif A')
plt.plot(LT,LB,'r--', label='réactif B')
plt.plot(LT,LC,'g--', label='produit C')
plt.xlabel('t en s')
plt.ylabel('Concentrations en $mol.L^{-1}$')
plt.title("Intégration par la méthode d'Euler \n réaction A + B = C \n loi de vitesse $v = k[A][B]^2$")
plt.legend()
plt.grid()
plt.show()