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
+++
@@ -44,23 +44,18 @@ on suppose:
44
44
45
45
## imports
46
46
47
-
importer les librairies qui vont bien pour cet exercice; on utilisera le mode `ipympl` de `matplotlib`
47
+
on pourra utiliser le mode `ipympl` de `matplotlib`
48
48
49
49
```{code-cell} ipython3
50
-
# à vous
51
-
```
52
-
53
-
```{code-cell} ipython3
54
-
# prune-cell
55
50
import numpy as np
56
51
import matplotlib.pyplot as plt
57
52
58
53
%matplotlib ipympl
59
54
```
60
55
61
-
## initialisation
56
+
## initialisation aléatoire
62
57
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
58
+
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
59
65
60
```{code-cell} ipython3
66
61
# les bornes pour le tirage au sort initial
@@ -75,9 +70,11 @@ speed_max = 1.
75
70
```{code-cell} ipython3
76
71
# votre code
77
72
78
-
def init_problem(n):
73
+
def init_problem(N):
79
74
"""
80
75
retourne un tuple masses, positions, speeds
76
+
de formes resp. (N,) (2, N) (2, N)
77
+
tiré au sort dans les bornes définies ci-dessus
81
78
"""
82
79
return None, None, None
83
80
```
@@ -86,20 +83,19 @@ def init_problem(n):
86
83
# prune-cell
87
84
88
85
def init_problem(N):
89
-
"""
90
-
retourne un tuple masses, positions, speeds
91
-
"""
92
86
masses = np.random.uniform(0, mass_max, size=N)
93
87
X = np.random.uniform(x_min, x_max, N)
94
88
Y = np.random.uniform(y_min, y_max, N)
95
89
angles = np.random.uniform(0, 2*np.pi, N)
96
90
modules = np.random.uniform(0, speed_max, N)
97
91
Sx = modules * np.cos(angles)
98
92
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
-
)
93
+
return (
94
+
masses,
95
+
# reshape(2, -1) is equivalent to (2, N) here
96
+
np.concatenate((X, Y)).reshape((2, -1)),
97
+
np.concatenate((Sx, Sy)).reshape((2, -1))
98
+
)
103
99
```
104
100
105
101
```{code-cell} ipython3
@@ -117,6 +113,30 @@ except:
117
113
print("KO")
118
114
```
119
115
116
+
## initialisation reproductible
117
+
118
+
par commodité on vous donne la fonction suivante qui crée 3 objets:
119
+
120
+
- le premier - pensez au soleil - de masse 3, an centre de la figure, de vitesse nulle
121
+
- et deux objets de masse 1, disposés symétriquement autour du soleil
122
+
- position initiale (5, 1) et vitesse initiale (-1, 0)
123
+
- symétrique en (-5, -1) et vitesse initiale (1, 0)
124
+
125
+
```{code-cell} ipython3
126
+
# for your convenience
127
+
128
+
def init3():
129
+
# first element is sun-like: heavy, at the center, and no speed
130
+
masses = np.array([3, 1, 1], dtype=float)
131
+
positions = np.array([
132
+
[0, 5, -5],
133
+
[0, 1, -1]], dtype=float)
134
+
speeds = np.array([
135
+
[0, -1, 1],
136
+
[0, 0, 0]], dtype=float)
137
+
return masses, positions, speeds
138
+
```
139
+
120
140
## les forces
121
141
122
142
à 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 +152,7 @@ pour cela on se propose d'écrire la fonction suivante
132
152
```{code-cell} ipython3
133
153
# votre code
134
154
135
-
def forces(positions, masses, G=1.0):
155
+
def forces(masses, positions, G=1.0):
136
156
"""
137
157
returns an array of shape (2, N)
138
158
that contains the force felt by each mass from all the others
0 commit comments