Adloun

Python (école d'ingénieur) · Chapitre 13 · Exercice

Oscillateur harmonique non amorti

Résolution d'équations différentielles

Énoncé

Simuler l'oscillateur harmonique avec , , . Comparer Euler explicite et RK4.

Corrigé

import numpy as np
import matplotlib.pyplot as plt

def oscillateur_amorti(X, t, gamma=0, omega0=2):
    y, v = X
    return np.array([v, -gamma * v - omega0**2 * y])

def rk4_systeme(F, X0, t0, tf, n, args=()):
    h = (tf - t0) / n
    t = np.linspace(t0, tf, n+1)
    X = np.zeros((n+1, len(X0)))
    X[0] = X0

    for k in range(n):
        k1 = F(X[k], t[k], *args)
        k2 = F(X[k] + 0.5*h*k1, t[k] + 0.5*h, *args)
        k3 = F(X[k] + 0.5*h*k2, t[k] + 0.5*h, *args)
        k4 = F(X[k] + h*k3, t[k] + h, *args)
        X[k+1] = X[k] + (h/6)*(k1 + 2*k2 + 2*k3 + k4)

    return t, X

def euler_systeme(F, X0, t0, tf, n, args=()):
    h = (tf - t0) / n
    t = np.linspace(t0, tf, n+1)
    X = np.zeros((n+1, len(X0)))
    X[0] = X0

    for k in range(n):
        X[k+1] = X[k] + h * F(X[k], t[k], *args)

    return t, X

X0 = [1.0, 0.0]
t0, tf = 0.0, 20.0
n = 200

t_euler, X_euler = euler_systeme(oscillateur_amorti, X0, t0, tf, n, args=(0, 2))
t_rk4, X_rk4 = rk4_systeme(oscillateur_amorti, X0, t0, tf, n, args=(0, 2))

# Solution exacte : y(t) = cos(2t)
t_exact = np.linspace(t0, tf, 500)
y_exact = np.cos(2 * t_exact)

plt.figure(figsize=(10, 6))
plt.plot(t_exact, y_exact, 'k-', linewidth=2, label='Solution exacte')
plt.plot(t_euler, X_euler[:, 0], 'r--', label='Euler explicite')
plt.plot(t_rk4, X_rk4[:, 0], 'b-', label='RK4')
plt.xlabel('t')
plt.ylabel('y(t)')
plt.title('Oscillateur harmonique (non amorti)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

Illustration Comparaison d'énergie et de trajectoire sur un oscillateur harmonique non amorti.

# Énergie mécanique E = 0.5 * (v^2 + omega0^2 * y^2)
print("Énergie mécanique (Euler) :", 0.5*(X_euler[-1,1]**2 + 4*X_euler[-1,0]**2))
print("Énergie mécanique (RK4)   :", 0.5*(X_rk4[-1,1]**2 + 4*X_rk4[-1,0]**2))
print("Énergie exacte (théorique): 2.0")

Résultat dans la console et interprétation : La méthode d'Euler explicite ne conserve pas l'énergie mécanique : elle introduit de l'énergie artificielle au cours du temps (le système diverge). RK4 conserve très bien l'énergie sur l'intervalle d'étude (amplitude stable).

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 →