Adloun

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

Illustration 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

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 →