Aller au contenu

L'Établi des Maths Cours

Outils pour apprendre et pratiquer

Terminale · Algorithmique et Programmation · TS4

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 π.

Objectifs du chapitre

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)(u_n) tend vers +∞+\infty, la boucle while u < A: se termine et fournit le plus petit nn tel que un≥Au_n \ge A.
  • Si (un)(u_n) converge vers ℓ\ell, on peut chercher un rang à partir duquel unu_n approche ℓ\ell à 10−p10^{-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,5nu_n - 6 = 4 \times 0{,}5^n : on cherche le premier nn tel que 4×0,5n≤0,0014 \times 0{,}5^n \le 0{,}001, soit 2n≥40002^n \ge 4000, d'où n=12n = 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 ff continue et strictement monotone sur [a;b][a ; b] avec f(a)f(a) et f(b)f(b) de signes contraires : l'équation f(x)=0f(x) = 0 a une unique solution α\alpha dans [a;b][a ; b] (corollaire du théorème des valeurs intermédiaires, chapitre TA3).
À chaque étape, on calcule le milieu mm et on garde la moitié qui contient α\alpha :

  • si f(a)×f(m)≤0f(a) \times f(m) \le 0, α∈[a;m]\alpha \in [a ; m] : on remplace bb par mm ;
  • sinon, α∈[m;b]\alpha \in [m ; b] : on remplace aa par mm.
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][a ; b], après nn étapes, elle vaut b−a2n\frac{b - a}{2^n}.
Pour obtenir une précision ee, il faut le plus petit nn tel que b−a2n≤e\frac{b - a}{2^n} \le e, c'est-à-dire 2n≥b−ae2^n \ge \frac{b - a}{e}, soit n≥ln⁡(b−ae)ln⁡2n \ge \frac{\ln\left(\frac{b - a}{e}\right)}{\ln 2}.
Exemple : sur [1;2][1 ; 2], pour e=0,01e = 0{,}01, il faut 2n≥1002^n \ge 100, donc n=7n = 7 étapes (27=1282^7 = 128). Chaque étape fait gagner environ « un tiers de chiffre décimal » : 1010 étapes divisent la longueur par 210=1024≈1032^{10} = 1024 \approx 10^3.

5. Méthode de Monte-Carlo

On tire au hasard nn points (x;y)(x ; y) uniformément dans un rectangle RR d'aire AR\mathcal{A}_R et on compte le nombre cc de points qui tombent dans un domaine D⊂RD \subset R. D'après la loi des grands nombres :
cn≈aire(D)AR\frac{c}{n} \approx \frac{\text{aire}(D)}{\mathcal{A}_R}
Estimation de π\pi : avec xx et yy dans [0;1[[0 ; 1[, la condition x2+y2≤1x^2 + y^2 \le 1 décrit un quart de disque d'aire π4\frac{\pi}{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≤M0 \le f \le M sur [0;A][0 ; A], avec x = A * random() et y = M * random(), la quantité A×M×cnA \times M \times \frac{c}{n} (où cc compte les points tels que y≤f(x)y \le f(x)) estime ∫0Af(x) dx\int_0^A f(x)\,\mathrm{d}x.

6. Pour aller plus loin : autres méthodes numériques

  • Méthode d'Euler (chapitre 1A4) : pour approcher la solution de y′=yy' = y, y(0)=1y(0) = 1, on itère y←y+h×yy \leftarrow y + h \times y avec un petit pas hh.
  • 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)x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)} ; 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 22 par étape, la méthode de Monte-Carlo a une précision de l'ordre de 1n\frac{1}{\sqrt{n}} : 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=0x^3 + x - 5 = 0 admet une unique solution α\alpha dans [1;2][1 ; 2], puis l'encadrer à 0,010{,}01 près à l'aide d'un programme.

  1. Étape 1 (Existence et unicité) : f(x)=x3+x−5f(x) = x^3 + x - 5 est continue et strictement croissante sur [1;2][1 ; 2] (somme de fonctions croissantes, dont une strictement) ; f(1)=−3<0f(1) = -3 < 0 et f(2)=5>0f(2) = 5 > 0 : par le corollaire du TVI, α\alpha existe et est unique.

  2. É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)
    
  3. Étape 3 (Exécution) : 77 étapes sont nécessaires (127≈0,0078≤0,01\frac{1}{2^7} \approx 0{,}0078 \le 0{,}01) ; le programme affiche 1.515625 1.5234375.

  4. Conclusion : 1,515<α<1,5241{,}515 < \alpha < 1{,}524 ; une valeur approchée de α\alpha à 0,010{,}01 près est 1,521{,}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 22, pour obtenir un encadrement d'amplitude inférieure ou égale à 10−410^{-4} ?

  1. Étape 1 (Longueur après n étapes) : 22n\frac{2}{2^n}.

  2. Étape 2 (Inéquation) : 22n≤10−4  ⟺  2n≥20 000  ⟺  n≥ln⁡(20 000)ln⁡2≈14,3\frac{2}{2^n} \le 10^{-4} \iff 2^n \ge 20\,000 \iff n \ge \frac{\ln(20\,000)}{\ln 2} \approx 14{,}3.

  3. Étape 3 (Vérification) : 214=16 384<20 000≤215=32 7682^{14} = 16\,384 < 20\,000 \le 2^{15} = 32\,768.

  4. Conclusion : il faut 1515 étapes.

Méthode : Estimer une intégrale par la méthode de Monte-Carlo

Exemple

Écrire un programme estimant I=∫02x2 dxI = \int_0^2 x^2\,\mathrm{d}x et prévoir la valeur autour de laquelle il fluctue.

  1. Étape 1 (Rectangle) : sur [0;2][0 ; 2], 0≤x2≤40 \le x^2 \le 4 : le domaine sous la courbe est inclus dans le rectangle [0;2]×[0;4][0 ; 2] \times [0 ; 4], d'aire 88.

  2. É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
    
  3. Étape 3 (Valeur théorique) : cn≈I8\frac{c}{n} \approx \frac{I}{8}, donc estimation(n) est proche de I=[x33]02=83≈2,67I = \left[\frac{x^3}{3}\right]_0^2 = \frac{8}{3} \approx 2{,}67.

  4. Conclusion : la valeur renvoyée fluctue autour de 83\frac{8}{3}, avec des écarts de l'ordre de 8n\frac{8}{\sqrt{n}} au plus pour nn grand.

Méthode : Approcher une limite avec un programme

Exemple

La suite définie par u0=10u_0 = 10 et un+1=0,5un+3u_{n+1} = 0{,}5u_n + 3 converge vers 66. Déterminer le premier rang nn tel que ∣un−6∣≤10−3|u_n - 6| \le 10^{-3}.

  1. Étape 1 (Suite auxiliaire) : vn=un−6v_n = u_n - 6 est géométrique de raison 0,50{,}5 et v0=4v_0 = 4, donc ∣un−6∣=4×0,5n|u_n - 6| = 4 \times 0{,}5^n.

  2. Étape 2 (Programme) : boucle while abs(u - 6) > 0.001: qui calcule le terme suivant et incrémente n (voir le point clé 2).

  3. Étape 3 (Calcul) : 4×0,5n≤0,001  ⟺  2n≥40004 \times 0{,}5^n \le 0{,}001 \iff 2^n \ge 4000 ; or 211=20482^{11} = 2048 et 212=40962^{12} = 4096.

  4. Conclusion : le programme affiche 1212 : à partir du rang 1212, unu_n est une valeur approchée de 66 à 10−310^{-3} près.

Pièges fréquents

Questions de révision

Essaie de répondre de tête avant d'afficher la réponse.

Après nn étapes de dichotomie à partir de [a;b][a ; b], quelle est la longueur de l'intervalle obtenu ?

b−a2n\frac{b - a}{2^n}.

Combien d'étapes de dichotomie faut-il pour passer d'un intervalle de longueur 11 à une longueur au plus 10−310^{-3} ?

1010 étapes, car 29=512<1000≤210=10242^9 = 512 < 1000 \le 2^{10} = 1024.

Dans l'estimation de π\pi par Monte-Carlo, de quoi la proportion de points vérifiant x2+y2≤1x^2 + y^2 \le 1 est-elle proche ?

De π4\frac{\pi}{4}, l'aire du quart de disque de rayon 11 (le carré [0;1]2[0 ; 1]^2 ayant pour aire 11).

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 ?

5555 (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)
  1. 88
  2. 55
  3. 1313
  4. 3232
Un indice

Le membre de droite b, a + b est évalué avant les affectations.

Voir la correction

Bonne réponse : A. 88

Couples (a ; b) successifs : (1 ; 1) → (1 ; 2) → (2 ; 3) → (3 ; 5) → (5 ; 8) → (8 ; 13). Après 55 tours, a vaut 88.

Exercice 2 Seuil et limite

Palier 2 · application

La suite définie par u0=2u_0 = 2 et un+1=0,5un+5u_{n+1} = 0{,}5u_n + 5 converge vers 1010. 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)
  1. 1010
  2. 99
  3. 1111
  4. 800800
Un indice

Note ℓ\ell la valeur fixe de la relation (ℓ=0,5ℓ+5\ell = 0{,}5\ell + 5) : la suite (un−ℓ)(u_n - \ell) est géométrique de raison 0,50{,}5 et de premier terme u0−ℓ=−8u_0 - \ell = -8.

Voir la correction

Bonne réponse : A. 1010

∣un−10∣=8×0,5n=82n|u_n - 10| = 8 \times 0{,}5^n = \frac{8}{2^n}. On veut 2n≥8002^n \ge 800 : 29=512<8002^9 = 512 < 800 et 210=1024≥8002^{10} = 1024 \ge 800. Le programme affiche 1010.

Exercice 3 Dichotomie

Palier 3 · approfondissement

Qu'affiche le programme suivant, qui encadre 3\sqrt{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. « 1.625 1.75 »
  2. « 1.5 1.75 »
  3. « 1.75 1.875 »
  4. « 1.6875 1.75 »
Un indice

Le test f(a) * f(m) <= 0 signifie que 3\sqrt{3} est dans [a;m][a ; m].

Voir la correction

Bonne réponse : A. « 1.625 1.75 »

Étape 1 : m=1,5m = 1{,}5, f(1,5)=−0,75f(1{,}5) = -0{,}75 est du signe de f(1)=−2f(1) = -2 : a=1,5a = 1{,}5. Étape 2 : m=1,75m = 1{,}75, f(1,75)=0,0625>0f(1{,}75) = 0{,}0625 > 0 : b=1,75b = 1{,}75. Étape 3 : m=1,625m = 1{,}625, f(1,625)≈−0,36<0f(1{,}625) \approx -0{,}36 < 0 : a=1,625a = 1{,}625. Le programme affiche « 1.625 1.75 », donc 1,625≤3≤1,751{,}625 \le \sqrt{3} \le 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 ?

  1. 14\frac{1}{4}
  2. 34\frac{3}{4}
  3. 13\frac{1}{3}
  4. 12\frac{1}{2}
Un indice

Le point (x;y)(x ; y) est choisi uniformément dans le carré [0;1]2[0 ; 1]^2, d'aire 11.

Voir la correction

Bonne réponse : A. 14\frac{1}{4}

La proportion cn\frac{c}{n} est proche de l'aire du domaine {0≤x≤1,0≤y≤x3}\{0 \le x \le 1, 0 \le y \le x^3\}, c'est-à-dire de ∫01x3 dx=[x44]01=14\int_0^1 x^3\,\mathrm{d}x = \left[\frac{x^4}{4}\right]_0^1 = \frac{1}{4}.