Adloun

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

Double pendule

Résolution d'équations différentielles

Énoncé

Simuler un double pendule en écrivant ses équations de Lagrange et en résolvant le système via SciPy.

Corrigé

Les équations différentielles décrivant le comportement chaotique du double pendule sont intégrées à l'aide du solveur solve_ivp.

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

def double_pendule(t, X, m1, m2, L1, L2, g):
    theta1, theta2, omega1, omega2 = X

    # Calculs intermédiaires
    delta_theta = theta1 - theta2
    denom1 = m1 + m2 * np.sin(delta_theta)**2
    denom2 = (m1 + m2) * L1

    # Accélérations
    alpha1 = (m2 * L1 * (omega1**2) * np.sin(delta_theta) * np.cos(delta_theta) +
              m2 * g * np.sin(theta2) * np.cos(delta_theta) +
              m2 * L2 * (omega2**2) * np.sin(delta_theta) -
              (m1 + m2) * g * np.sin(theta1)) / (denom1 * L1)

    alpha2 = ((-m2 * L2 * (omega2**2) * np.sin(delta_theta) * np.cos(delta_theta) +
               (m1 + m2) * g * np.sin(theta1) * np.cos(delta_theta) -
               (m1 + m2) * L1 * (omega1**2) * np.sin(delta_theta) -
               (m1 + m2) * g * np.sin(theta2)) / (denom1 * L2))

    return [omega1, omega2, alpha1, alpha2]

# Paramètres
m1, m2 = 1.0, 1.0
L1, L2 = 1.0, 1.0
g = 9.81

X0 = [np.pi/2, np.pi/2, 0.0, 0.0]
t0, tf = 0.0, 20.0

solution = solve_ivp(double_pendule, [t0, tf], X0,
                     args=(m1, m2, L1, L2, g),
                     method='RK45', rtol=1e-8, max_step=0.01)

t = solution.t
theta1, theta2 = solution.y[0], solution.y[1]

# Positions cartésiennes pour le tracé
x1 = L1 * np.sin(theta1)
y1 = -L1 * np.cos(theta1)
x2 = x1 + L2 * np.sin(theta2)
y2 = y1 - L2 * np.cos(theta2)

plt.figure(figsize=(12, 5))

plt.subplot(1, 2, 1)
plt.plot(t, theta1, 'b-', label='theta1')
plt.plot(t, theta2, 'r-', label='theta2')
plt.xlabel('t')
plt.ylabel('Angle (rad)')
plt.title('Évolution des angles')
plt.legend()
plt.grid(True, alpha=0.3)

plt.subplot(1, 2, 2)
plt.plot(x2, y2, 'b-', alpha=0.5)
plt.plot(x2[-1], y2[-1], 'ro', markersize=8)
plt.xlabel('x (m)')
plt.ylabel('y (m)')
plt.title('Trajectoire du second pendule')
plt.axis('equal')
plt.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

Illustration Comportement chaotique angulaire et trajectoire spatiale complexe du double pendule.

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 →