Botafogo

Résolution d’un système d’équations différentielles ordinaires

La fonction odeint permet de résoudre numériquement un système d’équations différentielles ordinaires (EDO) du premier ordre de la forme : et d’obtenir une approximation de l’évolution du système pour des temps supérieurs à . Ainsi, il est par exemple possible de résoudre l’équation (vectorielle) du pendule simple que nous étudions dans la série 24 en considérant le système : Les constantes et correspondent aux deux conditions initiales et (où est la longueur du fil). La fonction odeint retourne alors un vecteur solution : Ainsi, le code permettant de résoudre l’EDO du pendule simple pourrait débuter de la manière suivante :
python
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint

g = 9.81 ; L = 2 ; omegazerocarre = g/L # constantes
y_0 = np.array([np.pi/6, 0.0]) # vecteur conditions initiales
# ou : y_0 = [np.pi/6, 0.0]
On définit ensuite le membre de droite de l’EDO, f(t,y), sous forme vectorielle :
python
def f(t, y):
    theta, v = y
    return [v, -omegazerocarre*np.sin(theta)]
Cette fonction retourne un tableau de la même forme (shape) que y. Il est également nécessaire de construire un vecteur temps dont les éléments correspondent aux instants pour lesquels nous souhaitons obtenir une valeur approchée de la solution (la première entrée de ce tableau devant être la valeur initiale ) :
python
t_0 = 0 ; T = 10 ; N = 200 # N est le nombre de sous-intervalles
t = np.linspace(t_0, T, N+1) # vecteur contenant N+1 elements t_n
Il convient de noter que la partition choisie au moment de la construction de t ne sera pas prise en compte par odeint pour la résolution numérique du problème. En effet, odeint va adapter le pas utilisé en fonction de deux valeurs (qui correspondent à des tolérances relative et absolue) fournissant une majoration de l’erreur locale. Ces valeurs rtol et atol sont des keyword arguments valant par défaut environ . La solution approchée aux instants donnés par t est ensuite obtenue par interpolation. La ligne suivante fournit un tableau solution de dimension de forme (N+1,2) (à savoir ici (201,2)) :
python
sol = odeint(f, y_0, t, tfirst=True)
Le paramètre optionnel tfirst permet de préciser la position de la variable t dans la fonction f : f(y,t) ou f(t,y). Les solutions peuvent alors être “décompactées” :
python
angle = sol[:,0]
vitesse_angulaire = sol[:,1]
… et visualisées de manière habituelle :
python
plt.figure(figsize=(12,8)) 
plt.plot(t, angle, label=r"angle ${\theta(t)}$") 
plt.plot(t, vitesse_angulaire, label=r"vitesse angulaire "\
r"$\dot\theta(t)$") 
plt.grid()
plt.title("Solutions pour le pendule simple "\
r"(avec $\theta_0 = {\pi/6}$ et $\dot\theta_0 = {0}$)")
plt.xlabel('t')
plt.legend(loc='best')
plt.show()
Figure générée :
Le mouvement d’un pendule simple peut également être illustré en représentant la solution dans un espace particulier, appelé espace de phase avec en abscisse et en ordonnée :
python
plt.figure(figsize=(12,8)) 
plt.plot([min(angle),max(angle)],[0, 0],c='k')
plt.plot([0,0],[min(vitesse_angulaire),max(vitesse_angulaire)],c='k')
plt.plot(angle,vitesse_angulaire)
plt.plot([y_0[0]],[y_0[1]],'or')
plt.grid()
plt.title(r"Représentation dans l'espace de phase "\
rf"($\theta$,$\dot\theta$) de la solution correspondant "\
rf"à $\theta_0 = {y_0[0]:.4f}$ et $\dot\theta_0 = {y_0[1]}$")
plt.xlabel(r'$\theta$')
plt.ylabel(r'$\dot\theta$')
plt.show()
Figure générée :
Trois couples différents de conditions initiales (points rouges) fournissent trois courbes différentes :
Trajectoires et champ de directions :

Polycopié rédigé par Roger Sauser, CMS. Sauf indication contraire, le contenu de ce document est soumis à une licence Creative Commons internationale, Attribution - Utilisation non commerciale - Partage dans les mêmes conditions 4.0 International (CC BY-NC-SA 4.0).

© 2026 Projet Botafogo. En savoir plus.