Séance 15 · Partie B · Algorithmique et maths
Simulation
physique.
Avant de construire un robot, on le simule. Avant de lancer une fusée, on la simule. La méthode tient en une phrase : « la position dans un instant = la position maintenant + la vitesse × l’instant ».
Durée : 2 séances · Objectifs : vitesse et accélération comme taux de variation, méthode d’Euler, pas de temps, chute libre, frottements, rebonds, un robot qui freine, ressort et oscillations.
Ce que vous saurez faire à la fin
- Simuler n’importe quel mouvement dont on connaît l’accélération.
- Choisir un pas de temps et comprendre son effet sur la précision.
- Comparer une simulation à la formule exacte quand elle existe.
- Simuler un robot avec inertie, ce qui explique pourquoi il dépasse sa cible.
Physique de collège suffisante : vitesse = distance / temps. Le reste est construit ici.
01 / Euler
Vitesse constante : le mouvement le plus simple
À vitesse v pendant dt, on avance de v × dt.
C’est exact ici, quel que soit dt, parce que v ne change pas.
Toute la simulation physique consiste à répéter cette ligne, avec une vitesse qui change.
01 / Euler
Accélération : la vitesse change aussi
La méthode d’Euler
L’accélération est le taux de variation de la vitesse, comme la vitesse est celui de la position. Deux lignes, dans cet ordre : mettre à jour v avec a, puis x avec v. C’est la méthode d’Euler (1768), la plus simple des méthodes d’intégration numérique. Elle est approchée : entre deux pas, on suppose la vitesse constante alors qu’elle change. L’erreur diminue avec dt. En prépa, vous apprendrez que cette méthode résout des équations différentielles, et que cette version « v d’abord, puis x » (Euler semi-implicite) est bien meilleure que « x d’abord » pour la physique.
01 / Euler
Le pas de temps : précision contre coût
Lire le tableau
Diviser dt par 10 divise l’erreur par 10 environ : Euler est d’ordre 1. Mais cela multiplie le nombre de pas par 10. Pour un jeu vidéo à 60 images/s, dt = 1/60 suffit. Pour une trajectoire de sonde spatiale, on utilise des méthodes d’ordre 4 (Runge-Kutta) qui divisent l’erreur par 10 000 quand dt est divisé par 10. Un robot réel a un pas de temps imposé : celui de sa boucle de contrôle (souvent 10 à 100 ms).
02 / Forces
Les forces s’ajoutent : frottement de l’air
Newton en une ligne
a = F / m : l’accélération est la somme des forces divisée par la masse. Le simulateur n’a pas besoin de connaître la trajectoire, seulement les forces à chaque instant. Ajoutez une force, la trajectoire change toute seule. La vitesse limite est atteinte quand le frottement compense le poids : un parachutiste tombe à 200 km/h sans parachute, 20 km/h avec. Le v * abs(v) donne un signe correct dans les deux sens (frottement quadratique).
02 / Forces
En deux dimensions : le tir balistique
Ce que la simulation révèle
Sans frottement, 45° est optimal et 30° donne la même portée que 60° (symétrie, formule v₀² sin(2α)/g). Avec frottement, l’angle optimal descend vers 35–40°, et il n’existe aucune formule fermée : la simulation est le seul moyen d’obtenir ce résultat. C’est le cas de presque tous les problèmes réels. On a utilisé max(range, key=...) pour chercher le meilleur angle par force brute : 40 simulations, instantané.
02 / Forces
Rebonds : gérer un événement
Une suite géométrique cachée
Chaque rebond multiplie la vitesse par e, donc la hauteur par e² et la durée du vol par e. Les intervalles forment une suite géométrique de raison e = 0,8 : la simulation le retrouve à 1 % près. Somme des intervalles = durée totale avant l’arrêt = finie, bien qu’il y ait une infinité de rebonds (série géométrique, prépa). Le test if y < 0 détecte un événement : un robot qui touche un mur, un bouton pressé. La gestion d’événements dans une boucle à pas fixe est une compétence centrale.
03 / Robot
Un robot n’est pas un point : il a de l’inertie
Le dépassement
Couper les moteurs à la cible ne suffit pas : le robot a une vitesse, et le frottement met du temps à l’arrêter. Il dépasse. Un vrai robot doit anticiper : freiner avant. Le contrôleur est la fonction commande : elle lit l’état (x, v) et décide de la force. Toute la partie E consiste à écrire de bonnes fonctions commande.
03 / Robot
Un contrôleur proportionnel : freiner en approchant
Trois comportements
kp faible : pas de dépassement mais lent. kp fort : rapide mais oscille autour de la cible. Ajouter un terme en −kd·v (freiner d’autant plus qu’on va vite) supprime l’oscillation : c’est un contrôleur PD. Il manque un « I » pour compenser une erreur qui persiste (une pente, par exemple) : ce sera le PID complet de la séance 29. Vous venez de simuler en 30 lignes ce que fait un drone pour tenir sa position.
03 / Robot
Le ressort : quand la physique oscille toute seule
Pourquoi l’énergie est (presque) conservée
Un ressort sans frottement oscille éternellement : l’énergie passe de la forme « ressort tendu » à « masse en mouvement » et retour. Avec Euler « x d’abord », l’énergie augmenterait à chaque tour et la simulation exploserait. Avec « v d’abord » (ce qu’on fait ici), elle reste bornée : c’est une méthode symplectique, découverte bien après Euler, et c’est celle des simulateurs de systèmes solaires. Un accéléromètre ou une suspension de voiture sont des masses-ressorts ; les vibrations d’un robot aussi.
04 / Défis
Défi ★ — Le freinage d’urgence
Consigne
Un robot roule à 1,5 m/s. Un obstacle apparaît à 1 m. Ses moteurs peuvent produire une force de freinage de 3 N pour une masse de 2 kg, mais le freinage ne commence qu’après un temps de réaction de 0,1 s. Simuler et dire s’il percute l’obstacle, et à quelle vitesse. Quelle distance minimale de détection faut-il pour s’arrêter à temps ? (Chercher par essais successifs, puis avec une dichotomie sur la distance.)
Correction
def percute(distance, v0=1.5, f=3.0, m=2.0, reaction=0.1):
x, v, t = 0.0, v0, 0.0
while v > 0:
a = -f / m if t >= reaction else 0.0
v = max(0.0, v + a * dt)
x += v * dt
t += dt
if x >= distance:
return v
return 0.0
print("Obstacle à 1 m :", round(percute(1.0), 2), "m/s à l'impact (0 = arrêt avant)")
print("Obstacle à 0.8 m :", round(percute(0.8), 2), "m/s à l'impact")
bas, haut = 0.0, 5.0
while haut - bas > 0.001:
mil = (bas + haut) / 2
if percute(mil) > 0: bas = mil
else: haut = mil
print("Distance de détection minimale :", round(haut, 3), "m")
print("Formule : v0*réaction + v0²/(2a) =", round(1.5 * 0.1 + 1.5 ** 2 / (2 * 1.5), 3))À 1 m, le robot s’arrête juste avant l’obstacle (à 10 cm) ; à 0,8 m il le percute à ≈ 0,55 m/s. Distance minimale ≈ 0,9 m. La dichotomie sur une simulation est un outil puissant : on ne sait pas inverser la simulation, mais on sait chercher. Ici une formule existe (distance de réaction + distance de freinage) et confirme.
04 / Défis
Défi ★★ — Orbite
Consigne
Un satellite subit l’attraction de la Terre : accélération de norme GM/r² dirigée vers le centre (GM = 3,986 × 10¹⁴ m³/s²). Le placer à r = 7000 km avec une vitesse tangentielle v. Simuler 2 heures avec dt = 1 s.
1. Pour quelle v l’orbite est-elle circulaire (r reste constant à 0,1 % près) ? Formule : v = √(GM/r).
2. Avec v × 1,2 : l’orbite devient une ellipse. Mesurer le rayon maximal.
3. Avec v × 1,5 : le satellite revient-il ? (Vitesse de libération : v × √2.)
Correction
def orbite(v0, duree=7200):
x, y = r0, 0.0
vx, vy = 0.0, v0
r_min = r_max = r0
for _ in range(int(duree / dt)):
r = math.hypot(x, y)
a = -GM / r ** 3 # a_x = -GM x / r³ : vecteur vers le centre
vx += a * x * dt; vy += a * y * dt
x += vx * dt; y += vy * dt
r_min, r_max = min(r_min, r), max(r_max, r)
return r_min / 1000, r_max / 1000
for facteur in (1.0, 1.2, 1.5):
print(facteur, [round(r) for r in orbite(v_circ * facteur)])À v circulaire, r reste à 7000 km (± quelques km : l’erreur d’Euler). À 1,2 v, l’apogée monte à 18 000 km. À 1,5 v > √2 v, le satellite ne revient pas. Vous venez de reproduire les lois de Kepler et l’orbite de l’ISS avec 15 lignes. Remarquez -GM / r³ multiplié par x et y : c’est la façon élégante d’écrire un vecteur de norme GM/r² pointant vers le centre.
04 / Défis
Défi ★★★ — Esprit prépa : le pendule et la limite des petits angles
Consigne
Un pendule de longueur L = 1 m obéit à θ'' = −(g/L) sin θ. Au collège et au lycée on approxime sin θ ≈ θ (petits angles) et on obtient une période T₀ = 2π√(L/g), indépendante de l’amplitude.
1. Simuler le pendule exact (avec sin) pour des amplitudes de 5°, 30°, 90°, 170° et mesurer la période.
2. Tracer (en texte) le rapport T/T₀ en fonction de l’amplitude. À partir de quel angle l’approximation est-elle fausse de plus de 1 % ?
3. Que se passe-t-il pour une amplitude de 179,9° ? Et si on donne une vitesse initiale suffisante pour passer par-dessus ?
Correction et ouverture
def periode(theta0_deg):
theta = math.radians(theta0_deg)
omega = 0.0
t = 0.0
passages = []
while len(passages) < 3 and t < 60:
alpha = -(g / L) * math.sin(theta)
omega += alpha * dt
theta_avant = theta
theta += omega * dt
t += dt
if theta_avant > 0 >= theta: # passage descendant par 0
passages.append(t)
return passages[2] - passages[1]
T0 = 2 * math.pi * math.sqrt(L / g)
print("T0 =", round(T0, 4))
for a in (5, 30, 60, 90, 120, 150, 170):
T = periode(a)
print(f"{a:4}° : T = {T:.4f} T/T0 = {T / T0:.4f} " + "#" * int(40 * (T / T0 - 1)))T/T₀ vaut 1,0005 à 5°, 1,017 à 30°, 1,18 à 90°, 2,4 à 170°. L’approximation dépasse 1 % d’erreur vers 23°. À 179,9°, la période devient énorme : le pendule reste longtemps quasi immobile en haut (équilibre instable). Avec assez de vitesse, il tourne : le mouvement n’est plus périodique au même sens. La période exacte fait intervenir une intégrale elliptique sans formule fermée : la simulation est ici plus puissante que le calcul. Ce problème est un classique d’oral de l’X.
05 / Vérification
Quel est l’ordre correct des mises à jour à chaque pas ?
Deux questions supplémentaires
1. Si on divise dt par 2, que devient l’erreur d’Euler ? Divisée par 2 environ (ordre 1).
2. Pourquoi le robot dépasse-t-il sa cible avec la commande naïve ? Parce qu’il a une vitesse au moment où on coupe les moteurs, et que l’arrêt prend du temps : il faut freiner avant.
Référence
Les mots à retenir
| Mot | Définition |
|---|---|
| Pas de temps dt | Intervalle entre deux mises à jour. |
| Méthode d’Euler | v += a·dt ; x += v·dt. |
| Ordre d’une méthode | Comment l’erreur décroît quand dt diminue. |
| a = F / m | Deuxième loi de Newton. |
| Événement | Condition testée à chaque pas (sol, mur, cible). |
| Contrôleur | Fonction qui calcule la commande à partir de l’état. |
| Dépassement | Aller au-delà de la cible à cause de l’inertie. |
Pour continuer
Vous savez simuler le réel
Les simulations deviennent longues : état, forces, contrôleur, trace… Il est temps d’organiser tout cela en objets. Dernière séance de la partie B.
À faire chez soi
- Simuler deux corps qui s’attirent (Terre-Lune) et tracer les positions avec matplotlib sur votre PC.
- Ajouter du frottement au ressort et mesurer combien de temps met l’amplitude à être divisée par 2.
- Chercher « méthode de Verlet » et comparer sa précision à Euler sur la chute libre.
← Séance 14SommaireSéance 16 : Programmation orientée objet →