PE – Python numérique – S6

Projet de synthèse : le problème à n corps

S6 · mardi 20 octobre 2026

UE12 Python numérique – dernière séance

mardi 20 octobre 2026
PE – Python numérique – S6

Au programme aujourd'hui 🎯

Quiz 5 (10 min, papier, sans écran) sur la séance 5 et le devoir D5, puis correction flash.

Projet (2 h) : le problème à n corps — NumPy + matplotlib,
tout le cours dans un seul notebook, en binômes.

Rendu : poussé à 16 h 25, avant la clôture. C'est le dernier rendu du cours ; il compte comme un devoir.

Clôture (20 min) : une course, le bilan des six séances, et la suite.

Pas de cours nouveau aujourd'hui : tout ce qu'il faut est dans le notebook (énoncé, indices, tests).

mardi 20 octobre 2026
PE – Python numérique – S6

Les règles du jour

  • Quiz : 10 minutes, cahiers fermés, écrans éteints. On rend sa copie même blanche, avec son nom.
  • Projet : binômes autorisés — un rendu par personne (le même fichier, les deux noms dans la première cellule).
  • Documentation, notebooks du cours, vos devoirs : autorisés.
  • IA : tolérée pour comprendre ; vous devez pouvoir expliquer chaque ligne rendue.
  • Une seule boucle for autorisée : celle sur le temps, dans simulate.
    Pas de boucle sur les corps dans forces — c'est tout l'objet du projet.
mardi 20 octobre 2026
PE – Python numérique – S6

Ce que vous allez coder aujourd'hui 🪐

À gauche, init3(), votre cas de test. À droite, le « huit » à trois corps (Chenciner & Montgomery, 2000).
Tout part de la même fonction forces : quelques lignes de NumPy, sans boucle sur les corps.

mardi 20 octobre 2026
PE – Python numérique – S6

Le problème

Des corps massifs s'attirent par gravitation ; nous voulons calculer et tracer leurs trajectoires.
Le monde est en 2D ; chaque corps a une masse, une position, une vitesse.

Pour N corps, trois tableaux :

tableau forme contenu
masses (N,) masses[i]
positions (2, N) ligne 0 : tous les x ; ligne 1 : tous les y
speeds (2, N) idem pour vx, vy

Une configuration de test init3() est fournie : un "soleil" lourd au centre, deux satellites symétriques.
Toutes les cellules de test s'appuient dessus.

mardi 20 octobre 2026
PE – Python numérique – S6

Quatre fonctions — partie A (≈ 1 h 30)

  1. init_problem(N) — tire N corps au hasard → (masses, positions, speeds).
  2. Échauffement : les différences deux à deux r_j − r_i, sans boucle (1D, puis 2D).
  3. forces(masses, positions, G=1.0) — la force sur chaque corps, vectorisée, forme (2, N).
  4. simulate(masses, positions, speeds, dt=0.1, nb_steps=100) — Euler pas à pas → (nb_steps, 2, N).
  5. draw(traj, masses) — une trajectoire par corps → trajectoires.png.

Chaque étape a ses indices (dépliables) et ses tests (assert) : si la cellule de test passe, c'est bon.

Partie B (énergie, meilleur intégrateur, %timeit) : bonus pour ceux qui ont fini.

mardi 20 octobre 2026
PE – Python numérique – S6

L'idée clé : le broadcasting de la séance 2 💡

Il nous faut tous les vecteurs r_j − r_i, pour tous les couples (i, j). Avec des positions
(2, N), deux None bien placés suffisent — sans la moindre boucle !

positions = np.array([[0.0, 5.0, -5.0],     # x
                      [0.0, 0.0,  0.0]])    # y          → shape (2, 3)
Delta = positions[:, None, :] - positions[:, :, None]
Delta.shape             # (2, 3, 3)  : Delta[:, i, j] = positions[:, j] - positions[:, i]
dist = np.linalg.norm(Delta, axis=0)     # (3, 3) : la norme CONSOMME l'axe 0 (x, y)
  • (2, 1, N) contre (2, N, 1) → (2, N, N) : la règle « aligner par la droite » ;
  • la diagonale de dist est nulle : un corps ne s'attire pas lui-même — et on ne divise pas par 0
    (np.fill_diagonal(dist, np.inf)).
mardi 20 octobre 2026
PE – Python numérique – S6

Rendu et barème

Rendu : le notebook exécuté de bout en bout (Restart Kernel and Run All Cells),

  • trajectoires.png — dans le dossier D6/ de votre dépôt pe-homework,
    commité et poussé à 16 h 25, avant la clôture.
critère / 20
init_problem 3
différences deux à deux 4
forces vectorisée (pas de boucle sur les corps) 6
simulate 3
draw + figure + commentaire 4
partie B (bonus) +2 max

Un notebook incomplet mais qui s'exécute vaut toujours mieux qu'un notebook non rendu :
à 16 h 15, on arrête, on commente ce qui plante, on rend.

mardi 20 octobre 2026
PE – Python numérique – S6

C'est parti 🚀

  1. Téléchargez D6-n-corps.zip sur https://pe.mines.prasquier.dev, dézippez-le à la racine de votre dépôt pe-homework :
    vous obtenez un dossier D6/ prêt à l'emploi.
  2. Ouvrez Jupyter dans le dossier D6/ (sinon data/ est introuvable), ouvrez sujet.ipynb.
  3. Exécutez les trois premières cellules : imports, init3(), constantes.
  4. Partie A, dans l'ordre. Lisez les indices avant de demander de l'aide.

Bon courage !

mardi 20 octobre 2026
PE – Python numérique – S6

🏁 Clôture

Rendus poussés ? git push vérifié sur github.com ?

mardi 20 octobre 2026
PE – Python numérique – S6

Six séances, ce que vous savez faire 🗺️

thème vous savez… rendu
S1 NumPy, le tableau créer, reshape, découper ; distinguer vue et copie D1 damier, pixel art
S2 vectoriser ufunc, axis, broadcasting, masques : zéro boucle D2 Monte-Carlo, Mandelbrot
S3 pandas, tables read_csv, loc/iloc, index, NaN D3 marathon
S4 regrouper, croiser groupby, pivot_table, merge D4 énergie par région
S5 le temps, les figures dates, resample, rolling, subplots ; repérer une figure qui ment D5 série temporelle
S6 synthèse un modèle physique entier, vectorisé D6 n corps

Le fil rouge : penser en tableaux plutôt qu'en boucles, et regarder les données avant de conclure.

mardi 20 octobre 2026
PE – Python numérique – S6

Et après ? 🚀

Dans la suite de vos études

  • le cours Git, juste après : vous avez déjà add, commit, push
  • les projets d'informatique et de 2A : NumPy et pandas partout
  • du notebook au script : un .py, des fonctions, un main

Pour aller plus loin

  • scikit-learn : l'apprentissage automatique, sur vos DataFrame
  • polars : un pandas plus rapide, même logique
  • seaborn : l'annexe du site (pour la dataviz)
  • Python Data Science Handbook (VanderPlas), gratuit en ligne
  • Advent of Code, à partir du 1er décembre
mardi 20 octobre 2026
PE – Python numérique – S6

Votre avis 📝 (5 min, anonyme)

Ouvrez votre relevé de notes (le lien reçu par mail) → Donner mon avis

Une note de 1 à 5 et un commentaire par partie
(le cours, le prof, NumPy, pandas, les figures, le projet, les devoirs et les quiz),
puis le dosage : plus ou moins de temps sur quoi ?

Anonyme : votre lien sert seulement à n'accepter qu'une réponse par élève.
Un retour franc et constructif m'est plus utile qu'un retour poli.

mardi 20 octobre 2026
PE – Python numérique – S6

Merci pour ces six semaines 🙏

Les notes finales arrivent dans les prochains jours.

mardi 20 octobre 2026