Adloun

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")

Illustration 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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →