Intégration par la méthode d'Euler

Principe de la méthode d'Euler


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}

Condition de validité

La méthode d'Euler nécessite :

  • de connaître les valeurs initiales des grandeurs à intégrer (ici, $\mathsf{[A] \text{ à t=0}}$),
  • d'utiliser un pas de calcul $\mathsf{h}$ petit.

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.

Bibliothèques utilisées

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.

Manipulation du script

Les paramètres suivants peuvent être modifiés :

  • Valeur initiale de la concentration $\mathsf{[A]}$,
  • Valeurs de la constante de vitesse $\mathsf{k}$,
  • Pas de calcul $\mathsf{h}$ (notamment pour visualiser l'effet d'une utilisation d'un pas de calcul trop grand),
  • Durée d'intégration.
In [ ]:
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()

Conclusion

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.

Exemple avec solution analytique inexistante (ou difficile à obtenir)


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.

Manipulation du script

Les paramètres suivants peuvent être modifiés :

  • Valeurs initiales des concentrations $\mathsf{[A]}$, $\mathsf{[B]}$ et $\mathsf{[C]}$,
  • Valeurs de la constante de vitesse $\mathsf{k}$,
  • Pas de calcul $\mathsf{h}$,
  • Durée d'intégration.
In [ ]:
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()