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
@@ -25,7 +20,7 @@ pour faire cette activité sur votre ordi localement, {download}`commencez par t
25
20
26
21
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
et avec ces données vous devriez obtenir plus ou moins une sortie de ce genre
381
-
```{image} media/init3.png
375
+
et avec ces données vous devriez obtenir plus ou moins une sortie de ce genre
376
+
mais [voyez aussi la discussion ci-dessous sur les diverses stratégies possibles](label-n-body-strategies)
377
+
```{image} media/init3-1.png
382
378
```
383
379
384
380
+++
@@ -433,6 +429,42 @@ voyez un peu si vous arrivez à produire un outil un peu plus convivial pour exp
433
429
434
430
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...
435
431
432
+
+++
433
+
434
+
(label-n-body-strategies)=
435
+
## plusieurs stratégies
436
+
437
+
Pour les curieux, vous avez sans doute observé qu'il y a plusieurs façons possibles d'écrire la fonction `simulate()`
438
+
439
+
dans ce qui suit, on note l'accélération $a$, la vitesse $s$ et la position $p$
440
+
441
+
````{admonition} Option 1
442
+
:class: tip
443
+
dans l'implémentation qui a servi à calculer l'illustration ci-dessus, on a écrit principalement ceci:
444
+
- on calcule l'accélération
445
+
- ce qui permet d'extrapoler les vitesses
446
+
$s = s + a.dt$
447
+
- et ensuite d'extrapoler les positions
448
+
$p = p + s.dt$
449
+
```{admonition} 1bis
450
+
:class: dropdown
451
+
une variante consiste à intervertir les deux, en arguant du fait que la vitesse à l'instant $t$ agit sur la position à l'instant $t$
452
+
- on extrapole d'abord les positions
453
+
- puis seulement on calcule l'accélération
454
+
- enfin on extrapole les vitesses
455
+
```
456
+
````
457
+
````{admonition} Option 2
458
+
dans cette approche plus fine, on utiliserait deux versions de l'accélération (l'instant présent et l'instant suivant), et un dévelopmment du second ordre, ce qui conduirait à
459
+
- calculer la position comme $p = p + s.dt + \frac{a}{2}.dt^2$
460
+
- calculer les accélérations $a_+$ sur la base de cette nouvelle position
461
+
- estimer l'accélération sur l'intervalle comme la demie-somme entre les deux accélérations
Bref, vous voyez qu'il y a énormément de liberté sur la façon de s'y prendre
517
+
Ce qui peut expliquer pourquoi vous n'obtenez pas la même chose que les illustrations avec pourtant les mêmes données initiales
518
+
519
+
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
520
+
521
+
+++
522
+
523
+
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 !
Copy file name to clipboardExpand all lines: notebooks/numpy-tps/n-body/README-n-body-nb.md
+89-16Lines changed: 89 additions & 16 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,4 @@
1
1
---
2
-
authors:
3
-
- name: Aubin Geoffre
4
-
- name: Thierry Parmentelat
5
2
jupytext:
6
3
formats: md:myst
7
4
text_representation:
@@ -11,10 +8,6 @@ kernelspec:
11
8
name: python3
12
9
display_name: Python 3 (ipykernel)
13
10
language: python
14
-
language_info:
15
-
name: python
16
-
pygments_lexer: ipython3
17
-
nbconvert_exporter: python
18
11
---
19
12
20
13
# n-body problem
@@ -25,7 +18,7 @@ pour faire cette activité sur votre ordi localement, {download}`commencez par t
25
18
26
19
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
27
20
28
-
```{image} media/init3.png
21
+
```{image} media/init3-1.png
29
22
:align: center
30
23
:width: 600px
31
24
```
@@ -258,8 +251,9 @@ 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
262
-
```{image} media/init3.png
254
+
et avec ces données vous devriez obtenir plus ou moins une sortie de ce genre
255
+
mais [voyez aussi la discussion ci-dessous sur les diverses stratégies possibles](label-n-body-strategies)
256
+
```{image} media/init3-1.png
263
257
```
264
258
265
259
+++
@@ -314,6 +308,42 @@ voyez un peu si vous arrivez à produire un outil un peu plus convivial pour exp
314
308
315
309
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...
316
310
311
+
+++
312
+
313
+
(label-n-body-strategies)=
314
+
## plusieurs stratégies
315
+
316
+
Pour les curieux, vous avez sans doute observé qu'il y a plusieurs façons possibles d'écrire la fonction `simulate()`
317
+
318
+
dans ce qui suit, on note l'accélération $a$, la vitesse $s$ et la position $p$
319
+
320
+
````{admonition} Option 1
321
+
:class: tip
322
+
dans l'implémentation qui a servi à calculer l'illustration ci-dessus, on a écrit principalement ceci:
323
+
- on calcule l'accélération
324
+
- ce qui permet d'extrapoler les vitesses
325
+
$s = s + a.dt$
326
+
- et ensuite d'extrapoler les positions
327
+
$p = p + s.dt$
328
+
```{admonition} 1bis
329
+
:class: dropdown
330
+
une variante consiste à intervertir les deux, en arguant du fait que la vitesse à l'instant $t$ agit sur la position à l'instant $t$
331
+
- on extrapole d'abord les positions
332
+
- puis seulement on calcule l'accélération
333
+
- enfin on extrapole les vitesses
334
+
```
335
+
````
336
+
````{admonition} Option 2
337
+
dans cette approche plus fine, on utiliserait deux versions de l'accélération (l'instant présent et l'instant suivant), et un dévelopmment du second ordre, ce qui conduirait à
338
+
- calculer la position comme $p = p + s.dt + \frac{a}{2}.dt^2$
339
+
- calculer les accélérations $a_+$ sur la base de cette nouvelle position
340
+
- estimer l'accélération sur l'intervalle comme la demie-somme entre les deux accélérations
Bref, vous voyez qu'il y a énormément de liberté sur la façon de s'y prendre
396
+
Ce qui peut expliquer pourquoi vous n'obtenez pas la même chose que les illustrations avec pourtant les mêmes données initiales
397
+
398
+
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
399
+
400
+
+++
401
+
402
+
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 !
0 commit comments