Python (école d'ingénieur) · Chapitre 13 · Exercice
Équation raide
Résolution d'équations différentielles
Énoncé
Résoudre avec . Comparer les schémas d'Euler explicite et implicite face à ce problème raide (stiff).
Corrigé
Le schéma d'Euler implicite pour s'écrit : En isolant :
import numpy as np
import matplotlib.pyplot as plt
def f_raide(x, t):
return -1000 * (x - np.cos(t))
def euler_implicite_raide(x0, t0, tf, n):
h = (tf - t0) / n
t = np.linspace(t0, tf, n+1)
x = np.zeros(n+1)
x[0] = x0
for k in range(n):
x[k+1] = (x[k] + 1000 * h * np.cos(t[k+1])) / (1 + 1000 * h)
return t, x
x0 = 0.0
t0, tf = 0.0, 2.0
plt.figure(figsize=(10, 6))
for h in [0.001, 0.002, 0.003, 0.004, 0.005]:
n = int((tf - t0) / h)
try:
t_euler, x_euler = euler_explicite(f_raide, x0, t0, tf, n)
# Ne tracer que si les valeurs n'explosent pas
if np.max(np.abs(x_euler)) < 10:
plt.plot(t_euler, x_euler, '--', label=f'Euler explicite h={h}')
else:
print(f"Euler explicite explose pour h={h}")
except OverflowError:
print(f"Euler explicite explose pour h={h}")
# Solution de référence (Euler implicite petit pas)
t_ref, x_ref = euler_implicite_raide(x0, t0, tf, 10000)
plt.plot(t_ref, x_ref, 'k-', linewidth=2, label='Référence')
plt.xlabel('t')
plt.ylabel('x(t)')
plt.title('Équation raide (limite de stabilité d\'Euler explicite)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
Explosion numérique de la méthode d'Euler explicite pour des pas sur un problème raide.
Pour , la méthode d'Euler explicite diverge violemment (condition de stabilité non respectée). Euler implicite reste stable même pour de grands pas.
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.