School 47

Quatre algorithmes Python à maîtriser : seuil, dichotomie, Euler et simulation

Terminale · Mathématiques · environ 20 min

Ta calculatrice affiche ln(2) ≈ 0,693147 en un éclair, un logiciel de banque t'annonce l'année où ton livret dépassera 2 000 €, un simulateur prévoit la trajectoire d'une fusée. Pas de magie là-dedans : des boucles qui répètent un calcul simple jusqu'à atteindre la précision voulue. Au bac, quatre algorithmes reviennent sans cesse ; tu dois savoir les lire, les compléter et les écrire.

1. L'algorithme de seuil

La suite définie par u₀ = 100 et uₙ₊₁ = 0,9uₙ + 30 est croissante et converge vers 300. À partir de quel rang dépasse-t-elle 290 ?

def seuil(s):
 n = 0
 u = 100
 while u <= s:
 u = 0.9 * u + 30
 n = n + 1
 return n

seuil(290) renvoie 29. La boucle while tourne tant que sa condition est vraie : on y écrit la négation de ce que l'on cherche (u ≤ 290 tant que le seuil n'est pas dépassé). Attention : si la suite n'atteint jamais le seuil, comme avec seuil(300), la boucle ne s'arrête pas.

Vérification par le calcul. On montre que uₙ = 300 − 200 × 0,9ⁿ. Alors uₙ > 290 équivaut à 0,9ⁿ < 0,05, soit n × ln(0,9) < ln(0,05), donc n > ln(0,05)ln(0,9) ≈ 28,4 (on change le sens de l'inégalité car ln(0,9) < 0). Le premier rang est bien 29.

2. La dichotomie

Si f est continue sur [a ; b] et si f(a) et f(b) sont de signes contraires, le théorème des valeurs intermédiaires assure que f s'annule sur [a ; b]. On coupe l'intervalle en deux, on garde la moitié où le signe change, et on recommence.

def dichotomie(f, a, b, e):
 while b - a > e:
 m = (a + b) / 2
 if f(a) * f(m) <= 0:
 b = m
 else:
 a = m
 return a, b

Exemple. Pour f(x) = x³ + x − 1 sur [0 ; 1], f(0) = −1 < 0 et f(1) = 1 > 0. dichotomie(f, 0, 1, 0.001) renvoie (0.681640625, 0.6826171875) : la solution α vérifie 0,6816 ≤ α ≤ 0,6827. Chaque tour divise la longueur par 2 : après k tours, elle vaut b − a2ᵏ. Il a fallu 10 tours, car 2⁹ = 512 < 1 000 ≤ 2¹⁰ = 1 024.

3. La méthode d'Euler

Pour h petit, la tangente donne f(t + h) ≈ f(t) + h × f'(t). Pour approcher la solution de y' = y avec y(0) = 1 (la fonction exponentielle), on avance pas à pas : yₖ₊₁ = yₖ + h × yₖ.

def euler(n):
 h = 1 / n
 y = 1
 for k in range(n):
 y = y + h * y
 return y

euler(n) fait n pas de longueur h = 1n entre 0 et 1, donc approche e ≈ 2,71828. On obtient euler(10) ≈ 2,5937 (c'est 1,1¹⁰) et euler(1000) ≈ 2,7169 : plus le pas est petit, meilleure est l'approximation, mais plus le calcul est long. Pour y' = ay + b, seule la mise à jour change : yₖ₊₁ = yₖ + h × (ayₖ + b).

4. Simuler des échantillons

from random import random

def echantillon(n, p):
 succes = 0
 for i in range(n):
 if random() < p:
 succes = succes + 1
 return succes / n

def proportion_proches(N, n, p):
 bons = 0
 for j in range(N):
 f = echantillon(n, p)
 if abs(f - p) <= 1 / n ** 0.5:
 bons = bons + 1
 return bons / N

random() renvoie un nombre au hasard dans [0 ; 1[, donc random() < p est vrai avec la probabilité p : echantillon(n, p) simule n épreuves de Bernoulli indépendantes et renvoie la fréquence des succès. proportion_proches(1000, 100, 0.5) simule 1 000 échantillons de taille 100 et renvoie la proportion de ceux dont la fréquence est à au plus 1√100 = 0,1 de p. On obtient environ 0,96, une valeur qui change un peu à chaque appel. L'inégalité de Bienaymé-Tchebychev ne garantit que 1 − 0,25100 × 0,01 = 0,75 : elle est sûre, mais prudente.

À retenir

  • Seuil : une boucle while dont la condition est la négation du but ; elle ne s'arrête que si le seuil est atteint.
  • Dichotomie : f continue et changement de signe ; après k tours, l'intervalle mesure b − a2ᵏ.
  • Euler : pour y' = ay + b, yₖ₊₁ = yₖ + h × (ayₖ + b) ; plus h est petit, meilleure est l'approximation.
  • Simulation : random() < p simule un succès de probabilité p ; on répète pour former un échantillon, puis on répète les échantillons pour étudier la fluctuation.

★ Pour aller plus loin

La dichotomie gagne environ trois décimales tous les 10 tours, car 2¹⁰ = 1 024 ≈ 10³. La méthode de Newton, qui suit les tangentes, double à peu près le nombre de décimales exactes à chaque étape : appliquée à x² = 2, c'est la méthode qu'Héron d'Alexandrie décrivait déjà au Iᵉʳ siècle de notre ère.

L'erreur de la méthode d'Euler est à peu près proportionnelle au pas h : on dit qu'elle est d'ordre 1. Les méthodes de Runge-Kutta, mises au point par Carl Runge (1895) et Martin Kutta (1901), sont bien plus précises et tournent dans les simulateurs de vol et de météo. Dans le film « Les Figures de l'ombre » (2016), la mathématicienne Katherine Johnson recourt à la méthode d'Euler pour calculer le retour sur Terre de l'astronaute John Glenn.

Le langage Python a été créé par Guido van Rossum, qui en a publié la première version en 1991 ; son nom est un clin d'œil aux humoristes britanniques des Monty Python.

Sources pour creuser

  • Livres : Gérard Swinnen, « Apprendre à programmer avec Python 3 » (Eyrolles, version libre en ligne) ; Mickaël Launay, « Le grand roman des maths » (Flammarion).
  • Vidéos : chaîne YouTube « Yvan Monka » (cherche « algorithme de seuil Python Monka », « méthode de dichotomie Monka » et « méthode d'Euler Monka ») ; chaîne « Les Bons Profs » (cherche « algorithme de seuil suite »).
  • Institutionnel et pratique : docs.python.org/fr/3/ (documentation officielle en français) ; france-ioi.org (exercices d'algorithmique progressifs) ; eduscol.education.fr (programme de spécialité de Terminale).