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- Donner les valeurs successives de n et u jusqu’à l’arrêt.
- Que représente la valeur finale de n ?
- Pourquoi emploie-t-on ≤ dans la condition de boucle ?
Voir le corrigé
- Les couples sont , , et . La boucle s’arrête alors.
- n=3 est le premier rang où .
- 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 , pour un entier :
s = 0
for k in range(1, N):
s = s + k- Quelle somme le code calcule-t-il réellement ?
- Corriger la borne de range.
- Contrôler le programme corrigé pour N=5 avec une formule.
Voir le corrigé
- La borne de droite de range est exclue. Le code additionne de 1 à N−1, soit .
- Il faut écrire
range(1, N + 1). - Pour N=5, les valeurs de s sont 1, 3, 6, 10, 15. La formule donne aussi 15.
Encadrer et simuler
Exercice 3 : Une étape de dichotomie
Moyen
Pour , on sait qu’une racine unique est dans . 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- Donner les valeurs de a et b après cette étape.
- Justifier le choix du sous-intervalle.
- 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é
- , et . Le produit est positif, donc on prend , .
- Les valeurs aux extrémités de sont de signes opposés. La continuité garantit une racine dans cet intervalle.
- Chaque étape divise la longueur par deux. Après dix étapes, l’amplitude vaut , et non .
Exercice 4 : Fréquence simulée
Difficile
On simule N essais indépendants, avec un entier :
from random import random
s = 0
for k in range(N):
if random() < 0.3:
s = s + 1
frequence = s / N- Que représentent s et frequence dans le modèle probabiliste ?
- Donner l’espérance de frequence.
- 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é
- Dans le modèle d’une loi uniforme sur , chaque condition réalise un succès de probabilité 0,3. s compte les succès parmi N essais et frequence est leur proportion.
- , donc .
- 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- Donner le résultat de <code>premier_rang(80, 0.75, 10)</code>.
- Expliquer pourquoi la valeur de n retournée est minimale.
- 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 .
Voir le corrigé
- La fonction renvoie , soit environ .
- 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.
- Dans ce modèle, , et un seuil strictement positif inférieur à garantissent que 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- Expliquer l'invariant conservé lorsque l'appel est <code>dichotomie(1, 2, 0.01)</code>.
- Donner l'intervalle renvoyé.
- Justifier que sa largeur est au plus 0,01 et qu'il contient .
Indication
Suivre les couples (a,b) successifs sans arrondir les milieux.
Voir le corrigé
- À chaque étape, , donc . La mise à jour conserve cette propriété.
- Les bornes finales sont et .
- La boucle s'arrête car . L'invariant montre que 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- Quelle variable aléatoire la fonction simule-t-elle ?
- Écrire une fonction qui estime avec N simulations.
- 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é
- La fonction simule le nombre X de succès parmi n épreuves indépendantes de probabilité p, donc une loi .
def estime(n, p, N): compteur = 0 for _ in range(N): if succes(n, p) >= 3: compteur += 1 return compteur / N- 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 :
def euler(y, h, n):
valeurs = [y]
for _ in range(n):
y = y + h * (-2 * y + 4)
valeurs.append(y)
return valeurs- Calculer <code>euler(5, 0.1, 2)</code>.
- Donner la solution exacte vérifiant .
- 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é
- Les valeurs sont .
- La solution exacte est .
- . L'approximation 3,92 est inférieure d'environ 0,091.