San ti
L'équipe
-
YYYanlin
-
YDYawei
Description
threebody.py est un simulateur interactif du problème à trois corps avec interface graphique Tkinter et visualisation 3D animée via matplotlib. L'utilisateur peut soit saisir lui-même les masses, positions et vitesses initiales des trois corps, soit choisir parmi deux configurations périodiques célèbres (la solution triangulaire de Lagrange de 1772 et la figure en huit de Chenciner–Montgomery des années 1990). L'intégration numérique repose sur l'algorithme de Velocity Verlet. L'esthétique (fond bleu nuit #000010, doré #D6B381, image d'accueil santi.png) est un clin d'œil explicite au roman Le Problème à trois corps de Liu Cixin.
Présentation
Le sujet physique. Le problème à trois corps consiste à prédire le mouvement de trois masses en interaction gravitationnelle mutuelle. Contrairement au problème à deux corps, il n'admet pas de solution analytique générale, et il est en général chaotique : c'est précisément ce qui rend la simulation numérique intéressante et visuellement saisissante. Le projet met en scène cette imprévisibilité tout en proposant les rares solutions stables connues.
L'architecture du code. Le programme est structuré en deux grandes parties bien identifiables :
Le *moteur de simulation* repose sur une classe `Corps` (masse, position, vitesse, trajectoire) et une fonction `calcul_accelerations` qui applique la loi de Newton a⃗i=G∑j≠imjr⃗ji∥r⃗ji∥3\vec{a}_i = G \sum_{j \neq i} m_j \frac{\vec{r}_{ji}}{\|\vec{r}_{ji}\|^3}
ai=G∑j=imj∥rji∥3rji, avec un petit terme de régularisation (`+0.01`) pour éviter les divergences quand deux corps se croisent. La fonction `mise_a_jour` implémente l'intégrateur de **Velocity Verlet** : on met d'abord à jour les positions avec x+=v dt+12a dt2x \mathrel{+}= v\,dt + \tfrac{1}{2}a\,dt^2
x+=vdt+21adt2, puis on recalcule les accélérations, puis on met à jour les vitesses avec la moyenne v+=12(aancien+anouveau) dtv \mathrel{+}= \tfrac{1}{2}(a_\text{ancien} + a_\text{nouveau})\,dt
v+=21(aancien+anouveau)dt. C'est un choix pédagogiquement excellent : ordre 2, symplectique, conserve raisonnablement l'énergie sur de longues durées — bien supérieur à un Euler explicite, et plus simple qu'un Runge-Kutta 4.
L'interface est organisée en cinq frames Tkinter empilées (start_frame, welcome_frame, sim_frame_1, sim_frame_2, final_sim_frame) avec un système de navigation centralisé via show_frame et une fonction Return qui mémorise la frame précédente. Le flux utilisateur est : accueil → choix du mode → saisie ou sélection d'un cas → écran de simulation avec play/pause/retour/reprendre.
La visualisation. Une figure matplotlib 3D est embarquée dans la fenêtre Tkinter via FigureCanvasTkAgg. La simulation est pré-calculée intégralement (2000 pas de dt = 0.01), puis rejouée image par image avec FuncAnimation. Chaque corps a sa couleur (#2B3A67, #4EC9C9, #C47C4A) et laisse une trace de sa trajectoire complète. Le bouton play/pause est dessiné à la main sur un Canvas Tkinter (cercle + triangle ou deux barres), avec des effets de survol.
Les cas particuliers proposés.
Solution triangulaire de Lagrange : trois masses égales placées aux sommets d'un triangle équilatéral, tournant à vitesse constante autour de leur centre de masse. C'est l'un des cinq points de Lagrange du problème restreint, connue depuis 1772.
Figure en huit (Chenciner–Montgomery, 1993) : trois masses identiques parcourent la même courbe en forme de huit, en se poursuivant les unes les autres. C'est une découverte moderne remarquable, prouvée par variation de l'action.
Choix techniques et pistes d'amélioration. Le code est honnête et fonctionnel, avec quelques marqueurs typiques d'un projet d'élève : variables globales (ani, corps2, is_paused), un commentaire (ChatGPT written) sur show_frame, le bouton « Reprendre » qui relance toute la simulation au lieu de la mettre en pause proprement, et un couplage assez fort entre la logique de simulation et l'affichage. Pistes naturelles si l'élève veut aller plus loin : séparer physique et UI dans deux modules distincts, calculer et afficher l'énergie totale au cours du temps pour vérifier la conservation (très joli en pédagogique avec Verlet vs Euler), permettre de modifier la durée et le pas de temps depuis l'interface, et ajouter d'autres orbites périodiques connues (les configurations « broucke-hadjidemetriou-hénon » de la famille en huit, par exemple).
L'architecture du code. Le programme est structuré en deux grandes parties bien identifiables :
Le *moteur de simulation* repose sur une classe `Corps` (masse, position, vitesse, trajectoire) et une fonction `calcul_accelerations` qui applique la loi de Newton a⃗i=G∑j≠imjr⃗ji∥r⃗ji∥3\vec{a}_i = G \sum_{j \neq i} m_j \frac{\vec{r}_{ji}}{\|\vec{r}_{ji}\|^3}
ai=G∑j=imj∥rji∥3rji, avec un petit terme de régularisation (`+0.01`) pour éviter les divergences quand deux corps se croisent. La fonction `mise_a_jour` implémente l'intégrateur de **Velocity Verlet** : on met d'abord à jour les positions avec x+=v dt+12a dt2x \mathrel{+}= v\,dt + \tfrac{1}{2}a\,dt^2
x+=vdt+21adt2, puis on recalcule les accélérations, puis on met à jour les vitesses avec la moyenne v+=12(aancien+anouveau) dtv \mathrel{+}= \tfrac{1}{2}(a_\text{ancien} + a_\text{nouveau})\,dt
v+=21(aancien+anouveau)dt. C'est un choix pédagogiquement excellent : ordre 2, symplectique, conserve raisonnablement l'énergie sur de longues durées — bien supérieur à un Euler explicite, et plus simple qu'un Runge-Kutta 4.
L'interface est organisée en cinq frames Tkinter empilées (start_frame, welcome_frame, sim_frame_1, sim_frame_2, final_sim_frame) avec un système de navigation centralisé via show_frame et une fonction Return qui mémorise la frame précédente. Le flux utilisateur est : accueil → choix du mode → saisie ou sélection d'un cas → écran de simulation avec play/pause/retour/reprendre.
La visualisation. Une figure matplotlib 3D est embarquée dans la fenêtre Tkinter via FigureCanvasTkAgg. La simulation est pré-calculée intégralement (2000 pas de dt = 0.01), puis rejouée image par image avec FuncAnimation. Chaque corps a sa couleur (#2B3A67, #4EC9C9, #C47C4A) et laisse une trace de sa trajectoire complète. Le bouton play/pause est dessiné à la main sur un Canvas Tkinter (cercle + triangle ou deux barres), avec des effets de survol.
Les cas particuliers proposés.
Solution triangulaire de Lagrange : trois masses égales placées aux sommets d'un triangle équilatéral, tournant à vitesse constante autour de leur centre de masse. C'est l'un des cinq points de Lagrange du problème restreint, connue depuis 1772.
Figure en huit (Chenciner–Montgomery, 1993) : trois masses identiques parcourent la même courbe en forme de huit, en se poursuivant les unes les autres. C'est une découverte moderne remarquable, prouvée par variation de l'action.
Choix techniques et pistes d'amélioration. Le code est honnête et fonctionnel, avec quelques marqueurs typiques d'un projet d'élève : variables globales (ani, corps2, is_paused), un commentaire (ChatGPT written) sur show_frame, le bouton « Reprendre » qui relance toute la simulation au lieu de la mettre en pause proprement, et un couplage assez fort entre la logique de simulation et l'affichage. Pistes naturelles si l'élève veut aller plus loin : séparer physique et UI dans deux modules distincts, calculer et afficher l'énergie totale au cours du temps pour vérifier la conservation (très joli en pédagogique avec Verlet vs Euler), permettre de modifier la durée et le pas de temps depuis l'interface, et ajouter d'autres orbites périodiques connues (les configurations « broucke-hadjidemetriou-hénon » de la famille en huit, par exemple).
Galerie