Algorithmique et Python au bac Terminale : 8 exercices corrigés

Ces exercices d’algorithmique et Python font lire, tracer et corriger des programmes courts. Le code est lié à un objet mathématique et à une condition d’arrêt précise.

La simulation n’est pas confondue avec une preuve ni avec une valeur exacte. Les exemples portent sur un seuil, une dichotomie, une somme et la fréquence de succès.

Tracer et corriger

Exercice 1 : Un seuil strict

Facile
On exécute :
n = 0
u = 2
while u <= 5:
    u = 1.5 * u
    n = n + 1
  1. Donner les valeurs successives de n et u jusqu’à l’arrêt.
  2. Que représente la valeur finale de n ?
  3. Pourquoi emploie-t-on ≤ dans la condition de boucle ?
Voir le corrigé
  1. Les couples (n;u)(n;u) sont (0;2)(0;2), (1;3)(1;3), (2;4,5)(2;4,5) et (3;6,75)(3;6,75). La boucle s’arrête alors.
  2. n=3 est le premier rang où un=2(1,5)n>5u_n=2(1,5)^n\gt 5.
  3. On continue tant que le seuil strict n’est pas franchi. Si u valait exactement 5, une itération supplémentaire serait nécessaire.

Exercice 2 : Une somme oubliée

Moyen
Le code suivant doit calculer 1+2+⋯+N1+2+\cdots+N, pour un entier N≥1N\geq1 :
s = 0
for k in range(1, N):
    s = s + k
  1. Quelle somme le code calcule-t-il réellement ?
  2. Corriger la borne de range.
  3. Contrôler le programme corrigé pour N=5 avec une formule.
Voir le corrigé
  1. La borne de droite de range est exclue. Le code additionne de 1 à N−1, soit N(N−1)/2N(N-1)/2.
  2. Il faut écrire range(1, N + 1).
  3. Pour N=5, les valeurs de s sont 1, 3, 6, 10, 15. La formule N(N+1)/2N(N+1)/2 donne aussi 15.

Encadrer et simuler

Exercice 3 : Une étape de dichotomie

Moyen
Pour f(x)=x3+x−1f(x)=x^3+x-1, on sait qu’une racine unique est dans [0,1][0,1]. On exécute :
a = 0
b = 1
m = (a + b) / 2
if (a**3 + a - 1) * (m**3 + m - 1) <= 0:
    b = m
else:
    a = m
  1. Donner les valeurs de a et b après cette étape.
  2. Justifier le choix du sous-intervalle.
  3. Quelle amplitude obtient-on après dix étapes identiques ?
Indication
La condition compare les signes aux deux extrémités du sous-intervalle gauche.
Voir le corrigé
  1. m=0,5m=0,5, f(a)=−1f(a)=-1 et f(m)=−0,375f(m)=-0,375. Le produit est positif, donc on prend a=0,5a=0,5, b=1b=1.
  2. Les valeurs aux extrémités de [0,5;1][0,5;1] sont de signes opposés. La continuité garantit une racine dans cet intervalle.
  3. Chaque étape divise la longueur par deux. Après dix étapes, l’amplitude vaut 2−10=1/10242^{-10}=1/1024, et non 1/101/10.

Exercice 4 : Fréquence simulée

Difficile
On simule N essais indépendants, avec un entier N≥1N\geq1 :
from random import random
s = 0
for k in range(N):
    if random() < 0.3:
        s = s + 1
frequence = s / N
  1. Que représentent s et frequence dans le modèle probabiliste ?
  2. Donner l’espérance de frequence.
  3. Le programme renvoie-t-il nécessairement 0,3 ? Pourquoi faut-il N≥1 ?
Indication
Associer chaque comparaison à une variable de Bernoulli, puis utiliser la linéarité de l’espérance.
Voir le corrigé
  1. Dans le modèle d’une loi uniforme sur [0,1[[0,1[, chaque condition réalise un succès de probabilité 0,3. s compte les succès parmi N essais et frequence est leur proportion.
  2. E(s)=0,3NE(s)=0,3N, donc E(frequence)=0,3E(\text{frequence})=0,3.
  3. Non, la valeur varie d’une simulation à l’autre. Le programme estime la probabilité, il ne la calcule pas exactement. Avec N=0, la division finale serait impossible.

Écrire des fonctions qui s’arrêtent

Les conditions de boucle sont reliées à une propriété mathématique qui garantit la terminaison.

Exercice 5 : Premier rang sous un seuil

Moyen
On utilise la fonction suivante :
def premier_rang(u0, q, seuil):
    n = 0
    u = u0
    while u > seuil:
        u = q * u
        n = n + 1
    return n, u
  1. Donner le résultat de <code>premier_rang(80, 0.75, 10)</code>.
  2. Expliquer pourquoi la valeur de n retournée est minimale.
  3. Donner des conditions sur u0, q et seuil qui garantissent ici l'arrêt de la boucle.
Indication
Relier les valeurs successives à la suite géométrique un=u0qnu_n=u_0q^n.
Voir le corrigé
  1. La fonction renvoie (8;80×0,758)(8;80\times0,75^8), soit environ (8;8,01)(8;8,01).
  2. La boucle continue tant que le terme est strictement supérieur à 10 et s'arrête au premier terme inférieur ou égal à 10. Le rang 8 est donc minimal.
  3. Dans ce modèle, u0>0u_0\gt 0, 0<q<10\lt q\lt 1 et un seuil strictement positif inférieur à u0u_0 garantissent que u0qnu_0q^n finit par passer sous le seuil.

Exercice 6 : Dichotomie complète

Difficile
On exécute :
def dichotomie(a, b, eps):
    while b - a > eps:
        m = (a + b) / 2
        if m * m < 2:
            a = m
        else:
            b = m
    return a, b
  1. Expliquer l'invariant conservé lorsque l'appel est <code>dichotomie(1, 2, 0.01)</code>.
  2. Donner l'intervalle renvoyé.
  3. Justifier que sa largeur est au plus 0,01 et qu'il contient 2\sqrt2.
Indication
Suivre les couples (a,b) successifs sans arrondir les milieux.
Voir le corrigé
  1. À chaque étape, a2<2≤b2a^2\lt 2\leq b^2, donc a<2≤ba\lt \sqrt2\leq b. La mise à jour conserve cette propriété.
  2. Les bornes finales sont a=1,4140625a=1,4140625 et b=1,421875b=1,421875.
  3. La boucle s'arrête car b−a=0,0078125≤0,01b-a=0,0078125\leq0,01. L'invariant montre que 2\sqrt2 reste dans cet intervalle.

Simuler et approcher un modèle

Le résultat aléatoire d'une simulation est séparé de la valeur théorique, puis Euler est appliqué à une équation différentielle.

Exercice 7 : Simuler une variable binomiale

Moyen
On dispose du code :
from random import random

def succes(n, p):
    x = 0
    for _ in range(n):
        if random() < p:
            x = x + 1
    return x
  1. Quelle variable aléatoire la fonction simule-t-elle ?
  2. Écrire une fonction qui estime P(X≥3)P(X\geq3) avec N simulations.
  3. Pourquoi deux appels de cette fonction peuvent-ils donner des résultats différents ?
Indication
Compter le nombre d'appels où succes(n, p) renvoie une valeur au moins égale à 3.
Voir le corrigé
  1. La fonction simule le nombre X de succès parmi n épreuves indépendantes de probabilité p, donc une loi B(n,p)\mathcal B(n,p).
  2. def estime(n, p, N):
        compteur = 0
        for _ in range(N):
            if succes(n, p) >= 3:
                compteur += 1
        return compteur / N
  3. Les appels à random() produisent de nouveaux tirages. L'estimation fluctue ; elle se stabilise seulement lorsque N devient grand.

Exercice 8 : Euler pour un retour à l’équilibre

Difficile
La fonction suivante approche la solution de y′=−2y+4y'=-2y+4 :
def euler(y, h, n):
    valeurs = [y]
    for _ in range(n):
        y = y + h * (-2 * y + 4)
        valeurs.append(y)
    return valeurs
  1. Calculer <code>euler(5, 0.1, 2)</code>.
  2. Donner la solution exacte vérifiant y(0)=5y(0)=5.
  3. Comparer la dernière approximation à la valeur exacte en 0,2.
Indication
Soustraire la solution constante 2 pour résoudre exactement l'équation.
Voir le corrigé
  1. Les valeurs sont [5;4,4;3,92][5;4,4;3,92].
  2. La solution exacte est y(t)=2+3e−2ty(t)=2+3e^{-2t}.
  3. y(0,2)=2+3e−0,4≈4,011y(0,2)=2+3e^{-0,4}\approx4,011. L'approximation 3,92 est inférieure d'environ 0,091.