Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

pour faire cette activité sur votre ordi localement, commencez par télécharger le zip

dans ce TP on vous invite à écrire un simulateur de la trajectoire de n corps qui interagissent entre eux au travers de leurs masses, pour produire des sorties de ce genre

on suppose:

imports

on pourra utiliser le mode ipympl de matplotlib

initialisation aléatoire

en fixant arbitrairement des limites dans l’espace des positions, des vitesses et des masses, la fonction init_problem() tire au hasard une configuration de départ pour la simulation

KO

initialisation reproductible

par commodité on vous donne la fonction suivante qui crée 3 objets:

les forces

à présent, on va écrire une fonction qui va calculer les influences de toutes les particules entre elles, suivant la loi de Newton

F⃗i=∑j=1j≠iNG mimj r⃗j−r⃗i∣r⃗j−r⃗i∣3\vec{F}_i = \sum_{\substack{j=1 \\ j \neq i}}^N G \, m_i m_j \, \frac{\vec{r}_j - \vec{r}_i}{\lvert \vec{r}_j - \vec{r}_i \rvert^3}

pour cela on se propose d’écrire la fonction suivante

le simulateur

à présent il nous reste à utiliser cette brique de base pour “faire avancer” le modèle depuis son état initial et sur un nombre fixe d’itérations

cela pourrait se passer dans une fonction qui ressemblerait à ceci

OOPS <class 'AttributeError'> 'NoneType' object has no attribute 'shape'

dessiner

ne reste plus qu’à dessiner; quelques indices potentiels:

un jeu de couleurs

on assemble le tout

pour commencer et tester, on se met dans l’état initial reproductible

et avec ces données vous devriez obtenir plus ou moins une sortie de ce genre
mais voyez aussi la discussion ci-dessous sur les diverses stratégies possibles

après vous avez le droit de vous enhardir avec des scénarii plus compliqués par exemple avec ce code

m5, p5, s5 = init_problem(5)
sim5 = simulate(m5, p5, s5, nb_steps=1000)
draw(sim5, m5, scale=3);
plt.savefig("random5.png")

j’ai pu obtenir ceci




partie optionnelle

option 1: la 3D

modifiez votre code pour passer à une simulation en 3D

et appliquez-le aux conditions initiales suivantes

option 2: un rendu plus interactif

le rendu sous forme de multiples scatter plots donne une idée du résultat mais c’est très améliorable
voyez un peu si vous arrivez à produire un outil un peu plus convivial pour explorer les résultats de manière interactive; avec genre

voici une possibilité avec matplotlib; mais cela dit ne vous sentez pas obligé de rester dans Jupyter Lab ou matplotlib, il y a plein de technos rigolotes qui savent se décliner sur le web, vous avez l’embarras du choix...

Loading...

plusieurs stratégies

Pour les curieux, vous avez sans doute observé qu’il y a plusieurs façons possibles d’écrire la fonction simulate()

dans ce qui suit, on note l’accélération aa, la vitesse ss et la position pp

Bref, vous voyez qu’il y a énormément de liberté sur la façon de s’y prendre
Ce qui peut expliquer pourquoi vous n’obtenez pas la même chose que les illustrations avec pourtant les mêmes données initiales

D’autant que, c’est bien connu, ce problème des n-corps est l’exemple le plus célèbre de problème instable, et donc la moindre divergence entre deux méthodes de calcul peut entrainer de très sérieux écarts sur les résultats obtenus

Voici d’ailleurs les résultats obtenus avec ces deux approches alternatives, et vous pouvez constater qu’effectivement les résultats sont tous très différents !

approche 1bis

Loading...

approche 2

Loading...