Cours et exercices corrigés de terminale : Algorithmique et programmation en Python : listes, seuils, dichotomie et méthode de Monte-Carlo
Listes et fonctions Python, affectation simultanée, suites et algorithmes de seuil (précision d'une limite), dichotomie pour encadrer une solution de f(x) = 0, méthode de Monte-Carlo pour estimer une aire, une intégrale ou π.
Écrire des fonctions Python qui construisent, parcourent ou filtrent des listes (compréhension, sum, max, len, recherche d'un élément).
Utiliser l'affectation simultanée a, b = b, a + b pour programmer une suite récurrente d'ordre 2.
Programmer un algorithme de seuil, y compris pour déterminer un rang à partir duquel ∣un−ℓ∣≤10−p.
Encadrer une solution d'une équation f(x)=0 par dichotomie et déterminer le nombre d'étapes nécessaires pour une précision donnée.
Mettre en œuvre la méthode de Monte-Carlo pour estimer une aire, une intégrale ou le nombre π.
Analyser un programme : terminaison d'une boucle, valeur renvoyée, précision du résultat.
Le cours
1. Listes et fonctions : rappels et compléments
Création en compréhension avec filtre : [k for k in range(1, 50) if k % 7 == 3] donne [3, 10, 17, 24, 31, 38, 45].
Fonctions prédéfinies : len(L), sum(L), max(L), min(L) ; L.append(x) ajoute un élément ; L[-1] est le dernier élément.
Une fonction peut renvoyer une liste, ou s'interrompre dès qu'un résultat est trouvé :
def position(L, v):
for i in range(len(L)):
if L[i] == v:
return i # sortie immédiate
return -1 # v absent de L
Affectation simultanée : dans a, b = b, a + b, le membre de droite est entièrement calculé avant les affectations (suite de Fibonacci).
2. Suites et algorithmes de seuil
Si (un) tend vers +∞, la boucle while u < A: se termine et fournit le plus petit n tel que un≥A.
Si (un) converge vers ℓ, on peut chercher un rang à partir duquel un approche ℓ à 10−p près :
u = 10
n = 0
while abs(u - 6) > 0.001:
u = 0.5 * u + 3
n = n + 1
print(n) # affiche 12
Ici un−6=4×0,5n : on cherche le premier n tel que 4×0,5n≤0,001, soit 2n≥4000, d'où n=12. (Voir aussi le chapitre TA2.)
Une boucle while doit se terminer : si la suite ne dépasse jamais le seuil, le programme tourne indéfiniment.
3. Méthode de dichotomie
Soit f continue et strictement monotone sur [a;b] avec f(a) et f(b) de signes contraires : l'équation f(x)=0 a une unique solution α dans [a;b] (corollaire du théorème des valeurs intermédiaires, chapitre TA3). À chaque étape, on calcule le milieu m et on garde la moitié qui contient α :
si f(a)×f(m)≤0, α∈[a;m] : on remplace b par m ;
sinon, α∈[m;b] : on remplace a par m.
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
On passe la fonction f en paramètre (en Python, une fonction est une valeur comme une autre).
4. Précision et nombre d'étapes d'une dichotomie
À chaque étape, la longueur de l'intervalle est divisée par 2. Partant de [a;b], après n étapes, elle vaut 2nb−a. Pour obtenir une précision e, il faut le plus petit n tel que 2nb−a≤e, c'est-à-dire 2n≥eb−a, soit n≥ln2ln(eb−a). Exemple : sur [1;2], pour e=0,01, il faut 2n≥100, donc n=7 étapes (27=128). Chaque étape fait gagner environ « un tiers de chiffre décimal » : 10 étapes divisent la longueur par 210=1024≈103.
5. Méthode de Monte-Carlo
On tire au hasard n points (x;y) uniformément dans un rectangle R d'aire AR et on compte le nombre c de points qui tombent dans un domaine D⊂R. D'après la loi des grands nombres : nc≈ARaire(D) Estimation de π : avec x et y dans [0;1[, la condition x2+y2≤1 décrit un quart de disque d'aire 4π.
from random import random
def estimation_pi(n):
c = 0
for i in range(n):
x = random()
y = random()
if x ** 2 + y ** 2 <= 1:
c = c + 1
return 4 * c / n
Estimation d'une intégrale : si 0≤f≤M sur [0;A], avec x = A * random() et y = M * random(), la quantité A×M×nc (où c compte les points tels que y≤f(x)) estime ∫0Af(x)dx.
6. Pour aller plus loin : autres méthodes numériques
Méthode d'Euler (chapitre 1A4) : pour approcher la solution de y′=y, y(0)=1, on itère y←y+h×y avec un petit pas h.
Méthode des rectangles (chapitre TA7) : approximation déterministe d'une intégrale par une somme d'aires de rectangles.
Méthode de Newton : on remplace la courbe par sa tangente, xn+1=xn−f′(xn)f(xn) ; la convergence est en général beaucoup plus rapide que la dichotomie, mais elle n'est pas garantie.
Comparaison : la dichotomie gagne un facteur 2 par étape, la méthode de Monte-Carlo a une précision de l'ordre de n1 : pour gagner un chiffre, il faut 100 fois plus de points.
Méthodes et exemples rédigés
Méthode : Encadrer une solution par dichotomie
Exemple
Montrer que l'équation x3+x−5=0 admet une unique solution α dans [1;2], puis l'encadrer à 0,01 près à l'aide d'un programme.
Étape 1 (Existence et unicité) : f(x)=x3+x−5 est continue et strictement croissante sur [1;2] (somme de fonctions croissantes, dont une strictement) ; f(1)=−3<0 et f(2)=5>0 : par le corollaire du TVI, α existe et est unique.
Étape 2 (Programme) :
def f(x):
return x ** 3 + x - 5
a = 1
b = 2
while b - a > 0.01:
m = (a + b) / 2
if f(a) * f(m) <= 0:
b = m
else:
a = m
print(a, b)
Étape 3 (Exécution) : 7 étapes sont nécessaires (271≈0,0078≤0,01) ; le programme affiche 1.515625 1.5234375.
Conclusion : 1,515<α<1,524 ; une valeur approchée de α à 0,01 près est 1,52.
Méthode : Prévoir le nombre d'étapes d'une dichotomie
Exemple
Combien d'étapes de dichotomie faut-il, à partir d'un intervalle de longueur 2, pour obtenir un encadrement d'amplitude inférieure ou égale à 10−4 ?
Méthode : Estimer une intégrale par la méthode de Monte-Carlo
Exemple
Écrire un programme estimant I=∫02x2dx et prévoir la valeur autour de laquelle il fluctue.
Étape 1 (Rectangle) : sur [0;2], 0≤x2≤4 : le domaine sous la courbe est inclus dans le rectangle [0;2]×[0;4], d'aire 8.
Étape 2 (Programme) :
from random import random
def estimation(n):
c = 0
for i in range(n):
x = 2 * random()
y = 4 * random()
if y <= x ** 2:
c = c + 1
return 8 * c / n
Étape 3 (Valeur théorique) : nc≈8I, donc estimation(n) est proche de I=[3x3]02=38≈2,67.
Conclusion : la valeur renvoyée fluctue autour de 38, avec des écarts de l'ordre de n8 au plus pour n grand.
Méthode : Approcher une limite avec un programme
Exemple
La suite définie par u0=10 et un+1=0,5un+3 converge vers 6. Déterminer le premier rang n tel que ∣un−6∣≤10−3.
Étape 1 (Suite auxiliaire) : vn=un−6 est géométrique de raison 0,5 et v0=4, donc ∣un−6∣=4×0,5n.
Étape 2 (Programme) : boucle while abs(u - 6) > 0.001: qui calcule le terme suivant et incrémente n (voir le point clé 2).
Étape 3 (Calcul) : 4×0,5n≤0,001⟺2n≥4000 ; or 211=2048 et 212=4096.
Conclusion : le programme affiche 12 : à partir du rang 12, un est une valeur approchée de 6 à 10−3 près.
Pièges fréquents
La dichotomie suppose un changement de signe de f sur [a;b] et la continuité de f ; sans hypothèse de monotonie, elle trouve une solution, pas forcément la seule.
Ne pas confondre le nombre d'étapes et la précision : après n étapes, la longueur est 2nb−a, et non 2nb−a.
Avec la méthode de Monte-Carlo, le résultat est aléatoire : deux exécutions donnent des valeurs différentes, et la précision ne s'améliore que lentement (en n1).
Les calculs sur les flottants sont approchés : 0.1 + 0.2 == 0.3 vaut False. Dans une boucle, préférer une condition d'inégalité (while b - a > e:) à un test d'égalité.
Dans a, b = b, a + b, les deux affectations sont simultanées ; écrire a = b puis b = a + b donne un tout autre résultat.
Questions de révision
Essaie de répondre de tête avant d'afficher la réponse.
Après n étapes de dichotomie à partir de [a;b], quelle est la longueur de l'intervalle obtenu ?
2nb−a.
Combien d'étapes de dichotomie faut-il pour passer d'un intervalle de longueur 1 à une longueur au plus 10−3 ?
10 étapes, car 29=512<1000≤210=1024.
Dans l'estimation de π par Monte-Carlo, de quoi la proportion de points vérifiant x2+y2≤1 est-elle proche ?
De 4π, l'aire du quart de disque de rayon 1 (le carré [0;1]2 ayant pour aire 1).
Que contient la liste [k for k in range(1, 50) if k % 7 == 3] ?
[3, 10, 17, 24, 31, 38, 45].
Pourquoi utilise-t-on une boucle while dans un algorithme de dichotomie avec précision donnée ?
Parce qu'on répète la division de l'intervalle tant que sa longueur dépasse la précision voulue (le nombre d'étapes n'est pas écrit explicitement).
Que vaut a après a, b = 0, 1 puis dix exécutions de a, b = b, a + b ?
55 (dixième terme de la suite de Fibonacci).
Exercices corrigés
Exercice 1 Affectation simultanée
Palier 1 · découverte
Qu'affiche le programme Python suivant ?
a, b = 1, 1
for k in range(5):
a, b = b, a + b
print(a)
8
5
13
32
Un indice
Le membre de droite b, a + b est évalué avant les affectations.
Voir la correction
Bonne réponse : A. 8
Couples (a ; b) successifs : (1 ; 1) → (1 ; 2) → (2 ; 3) → (3 ; 5) → (5 ; 8) → (8 ; 13). Après 5 tours, a vaut 8.
Exercice 2 Seuil et limite
Palier 2 · application
La suite définie par u0=2 et un+1=0,5un+5 converge vers 10. Qu'affiche le programme suivant ?
u = 2
n = 0
while abs(u - 10) > 0.01:
u = 0.5 * u + 5
n = n + 1
print(n)
10
9
11
800
Un indice
Note ℓ la valeur fixe de la relation (ℓ=0,5ℓ+5) : la suite (un−ℓ) est géométrique de raison 0,5 et de premier terme u0−ℓ=−8.
Voir la correction
Bonne réponse : A. 10
∣un−10∣=8×0,5n=2n8. On veut 2n≥800 : 29=512<800 et 210=1024≥800. Le programme affiche 10.
Exercice 3 Dichotomie
Palier 3 · approfondissement
Qu'affiche le programme suivant, qui encadre 3 ?
def f(x):
return x ** 2 - 3
a = 1
b = 2
for k in range(3):
m = (a + b) / 2
if f(a) * f(m) <= 0:
b = m
else:
a = m
print(a, b)
« 1.625 1.75 »
« 1.5 1.75 »
« 1.75 1.875 »
« 1.6875 1.75 »
Un indice
Le test f(a) * f(m) <= 0 signifie que 3 est dans [a;m].
Voir la correction
Bonne réponse : A. « 1.625 1.75 »
Étape 1 : m=1,5, f(1,5)=−0,75 est du signe de f(1)=−2 : a=1,5. Étape 2 : m=1,75, f(1,75)=0,0625>0 : b=1,75. Étape 3 : m=1,625, f(1,625)≈−0,36<0 : a=1,625. Le programme affiche « 1.625 1.75 », donc 1,625≤3≤1,75.
Exercice 4 Monte-Carlo et intégrale
Palier 4 · défi
On exécute le programme suivant.
from random import random
def mc(n):
c = 0
for i in range(n):
x = random()
y = random()
if y <= x ** 3:
c = c + 1
return c / n
print(mc(100000))
Autour de quelle valeur le nombre affiché fluctue-t-il ?
41
43
31
21
Un indice
Le point (x;y) est choisi uniformément dans le carré [0;1]2, d'aire 1.
Voir la correction
Bonne réponse : A. 41
La proportion nc est proche de l'aire du domaine {0≤x≤1,0≤y≤x3}, c'est-à-dire de ∫01x3dx=[4x4]01=41.