Le but de ce court projet est de se remémorer la manière de calculer l'équation du mouvement d'un pendule simple et d'un pendule double et d'un pendule triple en utilisant une librairie python (sympy) qui permet de résoudre les équations différentielles. Cette dernière approche permettra de généraliser le calcul et la résolution de ces équations à n'importe quel pendule.
Librairies utilisées :
matplotlib.pyplotmatplotlib.animationnumpyscipy.integratesympy
Pour le pendule simple, le mouvement est régit par l'équation suivante :
Cette équation n'a pas de solution analytique simple à cause du terme
Pour le pendule double, le mouvement est régit par deux équations différentielles non-linéaires. Pour les calculer, on utilise la formule du Lagrangien :
Soit,
avec
Puis on trouve les équations grâce à la formule d'Euler-Lagrange :
Pour
Ceci permet d'obtenir les équations du mouvement pour
$\begin{cases} (m1+m2)l_1 \ddot \theta_1 + m_2l_2cos(\theta_1-\theta_2)\ddot \theta_2 + (m1+m2)gsin\theta_1 + m_2 l_2 sin(\theta_1-\theta_2) \dot \theta_2^2 = 0 \\ l_2\ddot\theta_2 + l_1cos(\theta1-\theta_2)\ddot\theta_1 - l_1sin(\theta_1-\theta_2)\dot\theta_1^2 + gsin(\theta_2)=0 \end{cases}$
À ce niveau là les deux équations sont encore non linéaires. Pour les linéariser, on utilise la méthode de Cramer avec les déterminants.
Pour le pendule triple, les équations comportent beaucoup plus de termes et deviennent plus fastidieuses à calculer à la main. Pour y remédier, on utilise le module sympy, qui permet de faire du calcul symbolique : construction du Lagrangien, dérivation automatique via Euler-Lagrange, puis extraction du système linéaire en linear_eq_to_matrix). Ce système est ensuite converti en fonctions numériques rapides avec lambdify, et résolu à chaque pas de temps avec np.linalg.solve.
Enfin, on se sert de la méthode utilisée pour le pendule triple et on la généralise pour un pendule de n tiges et n masses. Le travail n'est pas très compliqué une fois le pendule triple réalisé : il consiste à utiliser des listes de symboles (l_i, m_i, theta_i) et à boucler sur le nombre de pendules souhaité pour construire
Les positions cartésiennes de chaque masse sont obtenues par sommation cumulative des contributions de chaque tige précédente :
Pour rendre les simulations plus réalistes (amortissement progressif des oscillations), on ajoute un frottement visqueux à chaque articulation, via la fonction de dissipation de Rayleigh :
L'équation de Lagrange devient alors :
Ce qui revient simplement à ajouter le terme
Pour s'assurer que les équations et l'intégration numérique sont correctes, plusieurs vérifications sont utilisées tout au long du projet :
-
Conservation de l'énergie : sans frottement,
$E = T + V$ doit rester constante au cours du temps (à la précision de l'intégrateur près) ; avec frottement,$E$ doit décroître de façon strictement monotone.
-
Sensibilité aux conditions initiales : deux simulations partant d'angles initiaux quasi identiques (écart de l'ordre de
$10^{-3}$ rad) doivent diverger de façon exponentielle après un certain temps — signature caractéristique du chaos.
from pendulum import Pendulum
import numpy as np
# Pendule triple, longueurs et masses égales à 1, sans frottement
pendule = Pendulum(order=3, length=[1,1,1], mass=[1,1,1])
U_0 = [np.pi/2, 0, np.pi/2, 0, np.pi/2, 0] # [theta1, omega1, theta2, omega2, theta3, omega3]
pendule.pendulum_solver(U_0, start=0, end=100, n_step=2000)
pendule.show_animation()Avec frottement :
pendule_amorti = Pendulum(order=3, length=[1,1,1], mass=[1,1,1], damping=[0.1, 0.1, 0.1])






