You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
pour faire cette activité sur votre ordi localement, {download}`commencez par télécharger le zip<ARTEFACTS-n-body.zip>`
26
26
27
-
dans ce TP on vous invite à écrire un simulateur de la trajectoire de n corps qui interagissent entre eux au travers de leur poids, pour produire des sorties de ce genre
27
+
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
28
28
29
29
```{image} media/init3.png
30
30
:align: center
31
-
:width: 400px
31
+
:width: 600px
32
32
```
33
33
34
34
+++
@@ -40,27 +40,27 @@ on suppose:
40
40
- chacun est décrit par une masse constante
41
41
- et au début du monde chacun possède une position et une vitesse
42
42
43
+
```{admonition} la 3D
44
+
en option on vous proposera, une fois votre code fonctionnel en 2D, de passer à la 3D
45
+
ça peut valoir le coup d'anticiper ça dès le premier jet, si vous vous sentez de le faire comme ça
46
+
```
47
+
43
48
+++
44
49
45
50
## imports
46
51
47
-
importer les librairies qui vont bien pour cet exercice; on utilisera le mode `ipympl` de `matplotlib`
48
-
49
-
```{code-cell} ipython3
50
-
# à vous
51
-
```
52
+
on pourra utiliser le mode `ipympl` de `matplotlib`
52
53
53
54
```{code-cell} ipython3
54
-
# prune-cell
55
55
import numpy as np
56
56
import matplotlib.pyplot as plt
57
57
58
58
%matplotlib ipympl
59
59
```
60
60
61
-
## initialisation
61
+
## initialisation aléatoire
62
62
63
-
en fixant arbitrairement des limites dans l'espace des positions, des vitesses et des masses, on tire au hasard une configuration de départ pour la simulation
63
+
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
64
64
65
65
```{code-cell} ipython3
66
66
# les bornes pour le tirage au sort initial
@@ -75,9 +75,11 @@ speed_max = 1.
75
75
```{code-cell} ipython3
76
76
# votre code
77
77
78
-
def init_problem(n):
78
+
def init_problem(N):
79
79
"""
80
80
retourne un tuple masses, positions, speeds
81
+
de formes resp. (N,) (2, N) (2, N)
82
+
tiré au sort dans les bornes définies ci-dessus
81
83
"""
82
84
return None, None, None
83
85
```
@@ -86,20 +88,19 @@ def init_problem(n):
86
88
# prune-cell
87
89
88
90
def init_problem(N):
89
-
"""
90
-
retourne un tuple masses, positions, speeds
91
-
"""
92
91
masses = np.random.uniform(0, mass_max, size=N)
93
92
X = np.random.uniform(x_min, x_max, N)
94
93
Y = np.random.uniform(y_min, y_max, N)
95
94
angles = np.random.uniform(0, 2*np.pi, N)
96
95
modules = np.random.uniform(0, speed_max, N)
97
96
Sx = modules * np.cos(angles)
98
97
Sy = modules * np.sin(angles)
99
-
return (masses,
100
-
np.concatenate((X, Y)).reshape((2, -1)),
101
-
np.concatenate((Sx, Sy)).reshape((2, -1))
102
-
)
98
+
return (
99
+
masses,
100
+
# reshape(2, -1) is equivalent to (2, N) here
101
+
np.concatenate((X, Y)).reshape((2, -1)),
102
+
np.concatenate((Sx, Sy)).reshape((2, -1))
103
+
)
103
104
```
104
105
105
106
```{code-cell} ipython3
@@ -117,6 +118,30 @@ except:
117
118
print("KO")
118
119
```
119
120
121
+
## initialisation reproductible
122
+
123
+
par commodité on vous donne la fonction suivante qui crée 3 objets:
124
+
125
+
- le premier - pensez au soleil - de masse 3, an centre de la figure, de vitesse nulle
126
+
- et deux objets de masse 1, disposés symétriquement autour du soleil
127
+
- position initiale (5, 1) et vitesse initiale (-1, 0)
128
+
- symétrique en (-5, -1) et vitesse initiale (1, 0)
129
+
130
+
```{code-cell} ipython3
131
+
# for your convenience
132
+
133
+
def init3():
134
+
# first element is sun-like: heavy, at the center, and no speed
135
+
masses = np.array([3, 1, 1], dtype=float)
136
+
positions = np.array([
137
+
[0, 5, -5],
138
+
[0, 1, -1]], dtype=float)
139
+
speeds = np.array([
140
+
[0, -1, 1],
141
+
[0, 0, 0]], dtype=float)
142
+
return masses, positions, speeds
143
+
```
144
+
120
145
## les forces
121
146
122
147
à présent, on va écrire un fonction qui va calculer les influences de toutes les particules entre elles, suivant la loi de Newton
@@ -132,7 +157,7 @@ pour cela on se propose d'écrire la fonction suivante
132
157
```{code-cell} ipython3
133
158
# votre code
134
159
135
-
def forces(positions, masses, G=1.0):
160
+
def forces(masses, positions, G=1.0):
136
161
"""
137
162
returns an array of shape (2, N)
138
163
that contains the force felt by each mass from all the others
s = simulate(masses, positions, speeds, nb_steps=SMALL_STEPS)
257
+
258
+
try:
259
+
if s.shape == (SMALL_STEPS, 2, 3):
260
+
print("shape OK")
261
+
except Exception as exc:
262
+
print(f"OOPS {type(exc)} {exc}")
263
+
```
264
+
265
+
```{code-cell} ipython3
266
+
# pour tester: should be true
267
+
268
+
positions1 = s[1]
269
+
270
+
np.all(np.isclose(positions1, np.array([
271
+
[ 0. , 4.89877427, -4.89877427],
272
+
[ 0. , 0.99975485, -0.99975485]
273
+
])))
274
+
```
275
+
210
276
## dessiner
211
277
212
-
ne reste plus qu'à dessiner
278
+
ne reste plus qu'à dessiner; quelques indices potentiels:
279
+
280
+
-1. chaque corps a une couleur; l'appelant peut vous passer un jeu de couleurs, sinon en tirer un au hasard
281
+
- 2.a pour l'épaisseur de chaque point, on peut imaginer utiliser la masse de l'objet
282
+
2.b ou peut-être aussi, à tester, la vitesse de l'objet (plus c'est lent et plus on l'affiche en gros ?)
283
+
284
+
```{admonition} masses et vitesses ?
285
+
j'ai choisi de repasser à `draw()` le tableau des masses à cause de 2.a;
286
+
si j'avais voulu implémenter 2.b il faudrait tripoter un peu plus nos interfaces - car en l'état on n'a pas accès aux vitesses pendant la simulation - mais n'hésitez pas à le faire si nécessaire..
287
+
```
213
288
214
289
```{code-cell} ipython3
215
290
# votre code
216
291
217
-
def draw(simulation, colors=None):
292
+
def draw(simulation, masses, colors=None):
218
293
"""
219
-
takes as input the result of simulate() above,
294
+
takes as input the result of simulate() above,
220
295
and draws the nb_steps positions of each of the N bodies
0 commit comments