🎲Euler et Monte-Carlo
Cours de mathématiques · Terminale
Approcher une fonction définie par une équation différentielle avec la méthode d'Euler (pas h fixé, nombre d'itérations imposé), et estimer une aire / intégrale par la méthode des rectangles, ou par un comptage de type Monte-Carlo sur une liste de points imposée (sans random).
Ce que tu vas savoir faire
- ✓Programmer la méthode d'Euler pour y' = f(t, y) avec un pas et un nombre d'étapes.
- ✓Estimer une intégrale par la méthode des rectangles.
- ✓Estimer une aire en comptant des points sous une courbe (proportion).
- ✓Renvoyer des résultats arrondis (round) pour des tests reproductibles.
- ✓Prévoir ce que renvoie un programme d'approximation pas à pas.
La méthode d'Euler : avancer pas à pas
On veut approcher une fonction dont on connaît seulement la vitesse de variation et un point de départ . La méthode d'Euler avance par petits pas de longueur :
On suit la tangente sur une petite distance , puis on recommence. Plus est petit, plus l'approximation est précise (mais plus il faut d'étapes).
def euler(y0, h, n):
y = y0
t = 0
for _ in range(n):
y = y + h * y # ici f(t, y) = y (donc y' = y)
t = t + h
return round(y, 4)⭐ Pour les curieux — pourquoi ça marche ? La formule d'Euler n'est rien d'autre que l'équation de la tangente. Au point , la tangente à la courbe de a pour équation . Or on connaît justement la pente : . En se déplaçant d'un petit pas , donc en , la tangente vaut : c'est exactement ! On remplace donc la vraie courbe par sa tangente sur une courte distance , et plus est petit, moins la courbe a le temps de s'écarter de sa tangente.
Pour programmer Euler :
- Initialise
y = y0ett = 0(out = t0). - Boucle
for _ in range(n):(nombre de pas imposé). y = y + h * f(t, y)puist = t + h(mets à jouryAVANTt, ou stocke l'ancientsifdépend det).- Renvoie
round(y, k).
Pour , , , n = 2 :
euler(1, 0.5, 2) renvoie round(2.25, 4) = 2.25.
Quand f dépend de t, fais bien le calcul de y avec l'ancien t, puis incrémente t après. Sinon tu décales tout d'un pas.
Euler quand f dépend de t
Si dépend du temps , il faut utiliser la bonne valeur de t dans le calcul. Exemple : , , .
def euler_t(h, n):
y = 0
t = 0
for _ in range(n):
y = y + h * t # f(t, y) = t : on utilise t AVANT de l'augmenter
t = t + h
return round(y, 4)Avec et n = 4 : on ajoute successivement , , , , soit .
Ordre des instructions dans la boucle, quand f dépend de t :
- D'abord
y = y + h * f(t, y)(avec la valeur actuelle det). - Ensuite
t = t + h.
Si tu incrémentes t avant, tu utilises un t en avance et le résultat est faux.
euler_t(1, 4) : y passe par 0, puis 0, 1, 3, 6 (on ajoute successivement , , , ). Résultat : 6.
Si tes valeurs de départ sont des entiers, round(6, 4) renvoie 6 (un entier reste un entier) ; avec un flottant, round(6.0, 4) renvoie 6.0. Garde ça en tête quand tu compares à un résultat attendu.
Estimer une intégrale par les rectangles
L'aire sous une courbe entre et s'approche en découpant en n tranches de largeur et en additionnant l'aire de petits rectangles (méthode des rectangles à gauche) :
def rectangles(a, b, n):
h = (b - a) / n
aire = 0
for k in range(n):
x = a + k * h
aire = aire + h * (x * x) # g(x) = x^2
return round(aire, 4)Plus n est grand, plus l'estimation est proche de la vraie intégrale (ici ).
⭐ Pour les curieux — pourquoi ça marche ? Si la fonction est croissante, le rectangle à gauche a pour hauteur la plus petite valeur de sur sa tranche (le bord gauche). Chaque rectangle se loge donc entièrement sous la courbe, et la somme de leurs aires est forcément inférieure à la vraie intégrale. C'est exactement ce qu'on observe pour : on trouve puis , toujours en dessous, et on remonte vers à mesure que les tranches rétrécissent.
Pour la méthode des rectangles à gauche :
- Calcule le pas
h = (b - a) / n. - Accumulateur
aire = 0. - Pour
kde 0 àn-1:x = a + k*h, puisaire += h * g(x). - Renvoie
round(aire, k).
Pour sur avec n = 2 : h = 0.5. k=0 : x=0, aire += 0.50 = 0. k=1 : x=0.5, aire += 0.50.25 = 0.125. Total = 0.125.
Avec les rectangles à gauche, on évalue g au bord gauche de chaque tranche (x = a + k*h, pour k de 0 à n-1). On n'évalue jamais en b lui-même.
Monte-Carlo : compter des points (sans random)
La méthode de Monte-Carlo estime une aire en regardant quelle proportion de points tombe sous la courbe. Normalement les points sont tirés au hasard ; ici, comme on n'a pas le droit au hasard (random interdit), on te donne une liste de points (x, y) et tu comptes.
Pour estimer l'aire sous dans le carré : un point est « sous la courbe » si . La proportion de tels points, multipliée par l'aire du carré (ici 1), estime l'aire.
def monte_carlo(points):
dedans = 0
for (x, y) in points:
if y <= x * x: # sous la courbe y = x^2
dedans = dedans + 1
return round(dedans / len(points), 4)⭐ Pour les curieux — pourquoi ça marche ? Imagine qu'on saupoudre uniformément le carré de côté (d'aire ) avec des grains de sable. La part des grains qui tombe dans une zone donnée est tout simplement égale à l'aire de cette zone (puisque l'aire totale vaut ). En comptant la proportion de points sous la courbe , on mesure donc directement l'aire de la région située sous la courbe, c'est-à-dire l'intégrale. C'est la même idée que pour estimer en lançant des fléchettes dans un carré et en comptant celles qui tombent dans le cercle inscrit.
Pour un comptage de type Monte-Carlo :
- Compteur
dedans = 0. - Parcours la liste de points
for (x, y) in points:. - Teste si le point est sous la courbe (
if y <= g(x):) et incrémente. - Renvoie la proportion
round(dedans / len(points), k).
Avec points = [(0.5, 0.1), (0.5, 0.5), (0.2, 0.5), (0.9, 0.2)] et : sous la courbe si .
- (0.5, 0.1) : 0.1 ≤ 0.25 ✔
- (0.5, 0.5) : 0.5 ≤ 0.25 ✘
- (0.2, 0.5) : 0.5 ≤ 0.04 ✘
- (0.9, 0.2) : 0.2 ≤ 0.81 ✔
2 points sur 4 → round(2/4, 4) = 0.5.
for (x, y) in points: déballe directement chaque couple en deux variables x et y. Pratique pour traiter des listes de points.
Précision et nombre de points / d'étapes
Pour toutes ces méthodes, plus on en fait, mieux c'est :
- Euler : un pas
hplus petit (donc plus d'étapes) → courbe mieux suivie. - Rectangles : plus de tranches
n→ aire mieux approchée. - Monte-Carlo : plus de points → proportion plus fiable.
Mais cela coûte plus de calculs. On cherche un compromis entre précision et temps de calcul. Dans nos exercices, on impose ces paramètres pour obtenir un résultat reproductible qu'on arrondit.
Comme pour Newton et la dichotomie : fais tous tes calculs sans arrondir, et applique round(..., k) uniquement sur la valeur renvoyée.
Pour : rectangles à gauche avec n = 4 donne 0.2188 ; avec n = 10 on s'approche de 0.285 ; il faut beaucoup de tranches pour approcher 0.3333.
Si un test attend une valeur arrondie, respecte exactement le nombre de décimales demandé (round(x, 4) ≠ round(x, 2)).
Tu as lu le cours ? Passe à la pratique.
Un coach IA te guide sans jamais donner la réponse, avec des exercices et des quiz sur ce chapitre. Version d'essai gratuite, sans limite de durée.
S'entraîner avec le coach IA — gratuit