Python (école d'ingénieur) · Chapitre 13 · Exercice
Comparaison des solveurs SciPy
Résolution d'équations différentielles
Énoncé
Utiliser solve_ivp avec différentes méthodes pour résoudre un système oscillant raide.
Corrigé
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
# Système oscillant raide
def oscillateur_raide(t, X):
y, v = X
return [v, -1000*y - 0.1*v]
X0 = [1.0, 0.0]
t0, tf = 0.0, 5.0
methodes = ['RK45', 'Radau', 'BDF']
couleurs = ['b-', 'r-', 'g-']
plt.figure(figsize=(12, 5))
for meth, coul in zip(methodes, couleurs):
sol = solve_ivp(oscillateur_raide, [t0, tf], X0,
method=meth, rtol=1e-6, atol=1e-9)
t = sol.t
y = sol.y[0]
plt.plot(t, y, coul, label=meth, alpha=0.7)
# Solution de référence (pas très petit)
sol_ref = solve_ivp(oscillateur_raide, [t0, tf], X0,
method='RK45', rtol=1e-12, atol=1e-14)
plt.plot(sol_ref.t, sol_ref.y[0], 'k-', linewidth=2, label='Référence')
plt.xlabel('t')
plt.ylabel('y(t)')
plt.title('Comparaison des solveurs SciPy')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
print("Nombre de points évalués :")
for meth in methodes:
sol = solve_ivp(oscillateur_raide, [t0, tf], X0, method=meth,
rtol=1e-6, atol=1e-9)
print(f" {meth}: {len(sol.t)} points")
Comparaison des solveurs adaptatifs de SciPy sur un système oscillant raide.
Résultat dans la console :
Nombre de points évalués :
RK45: 846 points
Radau: 212 points
BDF: 284 points
Les solveurs pour problèmes raides (Radau, BDF) prennent des pas beaucoup plus grands et nécessitent moins d'évaluations que la méthode explicite standard RK45.
100 % gratuit
La suite du chapitre est sur Adloun
- 7 autres exercices corrigés dans ce chapitre, et 7 à chercher avec le tuteur
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.