Spécialité maths, Terminale • Exercices corrigés à Montréal
Exercices corrigés : Python, méthodes numériques et sciences (Terminale)
Voici une série d'exercices corrigés de méthodes numériques en Python, au niveau de la classe de Terminale spécialité mathématiques du programme français, telle qu'elle est suivie au Lycée Marie de France et au Collège Stanislas à Montréal.
En Terminale, un algorithme ne donne jamais une valeur exacte : il donne une valeur approchée, et la question posée au bac porte presque toujours sur l'ERREUR. Combien vaut-elle, comment la majorer, comment évolue-t-elle quand on divise le pas par deux. Chaque exercice de cette série pose cette question, et la réponse vient du cours d'analyse, pas de la machine. Vous y programmez une somme partielle qui approche le nombre e avec son reste majoré (exercice 1), la dichotomie et son nombre d'étapes (exercice 2), la méthode des rectangles qui encadre ∫01e−x2dx (exercice 3), la méthode d'Euler et sa forme explicite (exercice 4), la loi binomiale sans factorielle (exercice 5), la méthode de Newton guidée par la convexité (exercice 6) et la méthode des trapèzes, dont l'erreur suit le carré du pas (exercice 7).
Les problèmes portent ces méthodes en sciences : la charge d'un condensateur par la méthode d'Euler (exercice 9) et le suivi cinétique d'une réaction par régression logarithmique (exercice 10). Les classiques de la partie C ajoutent le seuil de la série harmonique (exercice 11), la suite de Fibonacci dans une liste (exercice 12), l'estimation de π par la méthode de Monte-Carlo (exercice 13), le point fixe du cosinus comparé à Newton (exercice 14) et la simulation de la somme de deux dés (exercice 15). L'exercice 8 fait corriger cinq affirmations fausses, dont « Newton converge quel que soit le point de départ ».
La partie D reprend les exemples d'algorithme que le programme officiel cite chapitre par chapitre et que la série n'avait pas encore : sécante pour la continuité, Briggs pour le logarithme, Brouncker et les milieux pour le calcul intégral, relation de Pascal et planche de Galton pour les probabilités. Son fil : un algorithme se juge à sa vitesse et à ses limites, et les deux se lisent sur les mathématiques avant de lancer la machine.
Série autocorrigéeTape tes réponses et vérifie-les question par question : la page te dit juste ou faux avant d'ouvrir la correction. Avec un compte, chaque bonne réponse du premier coup rapporte des points, et tes réponses justes restent remplies quand tu reviens.
•Une somme partielle se programme avec un accumulateur, et la mise à jour multiplicative d'une factorielle, f = f*k, évite de la recalculer entièrement à chaque tour.
•Dichotomie : à chaque étape la longueur de l'intervalle est divisée par 2, donc après n étapes elle vaut 2nb−a.
•Pour f monotone sur [a;b], les rectangles à gauche et à droite ENCADRENT l'intégrale, et l'écart entre les deux vaut n(b−a)∣f(b)−f(a)∣.
•Méthode d'Euler pour y′=ay+b : yk+1=yk+h(ayk+b), soit une suite arithmético-géométrique de raison 1+ah.
•Méthode de Newton : xk+1=xk−f′(xk)f(xk), c'est-à-dire l'abscisse où la tangente coupe l'axe des abscisses.
•Loi binomiale : P(X=k)=(kn)pk(1−p)n−k, et (k+1n)=(kn)×k+1n−k.
•L'erreur de la méthode des rectangles et celle de la méthode d'Euler sont proportionnelles au pas ; celle de la méthode des trapèzes est proportionnelle au carré du pas.
•Une condition d'arrêt numérique s'écrit toujours avec une inégalité, jamais avec une égalité de flottants.
•Méthode de la sécante : xk+1=xk−f(xk)×f(xk)−f(xk−1)xk−xk−1, c'est-à-dire Newton avec la pente d'une corde à la place de f′(xk).
•Méthode des milieux : Mn=h∑f(a+(k+21)h). Pour une fonction concave, Tn≤∫abf≤Mn ; pour une fonction convexe, l'inverse.
•Relation de Pascal dans une liste : L = [1] + [L[j] + L[j + 1] for j in range(len(L) - 1)] + [1] fait passer d'une ligne du triangle à la suivante.
Partie A : les bases (/50)
Exercice 1 : Approcher le nombre e et majorer le reste
On admet que e=∑k=0+∞k!1, et l'on pose Sn=∑k=0nk!1. On veut calculer Sn en Python.
def S(n):
s = 0
f = 1
for k in range(n+1):
if k > 0:
f = f*k
s = s + 1/f
return s
a) Expliquez le rôle de la variable f et donnez S5 au millionième.
b) Que vaut S10 ? Comparez à e≈2,718281828.
c) On admet la majoration 0<e−Sn<n×n!1. Vérifiez-la pour n=10.
d) Pourquoi met-on f = f*k à jour dans la boucle plutôt que de recalculer k! à chaque tour ?
Voir la correction
Réponses
a)f contient k! ; S5≈2,716667
b)S10≈2,7182818, écart ≈2,7×10−8
c)10×10!1≈2,756×10−8 majore l'écart
d)Une multiplication par tour au lieu de k
a)
La variable f contient la factorielle du rang courant : elle vaut 1 pour k=0, puis elle est multipliée par k à chaque nouveau tour, ce qui donne successivement 1, 1, 2, 6, 24, 120. On accumule donc 0!1+1!1+⋯+5!1=1+1+0,5+0,16+0,0416+0,0083, soit S5≈2,716667. Deux accumulateurs travaillent en parallèle, l'un additif pour la somme, l'autre multiplicatif pour la factorielle, chacun initialisé à l'élément neutre de son opération, 0 et 1.
b)
On obtient S10≈2,7182818011, à comparer à e≈2,7182818285. Les huit premières décimales coïncident, et l'écart vaut environ 2,7×10−8. Onze termes suffisent donc à une précision que le balayage de l'exercice suivant n'atteindrait qu'après des millions de tours : c'est la puissance des factorielles au dénominateur, qui décroissent bien plus vite que n'importe quelle suite géométrique.
c)
Pour n=10 : 10!=3628800, donc 10×10!1=362880001≈2,756×10−8. L'écart réellement constaté, 2,731×10−8, lui est bien inférieur ✓. Cette majoration est ce que l'énoncé de bac attend : elle GARANTIT la précision sans connaître e, alors que la comparaison de la question b) suppose déjà connue la valeur cherchée. C'est toute la différence entre constater une erreur et la majorer.
d)
Pour une raison de COÛT. Recalculer k! à chaque tour demande k multiplications, donc au total 1+2+⋯+n=2n(n+1) multiplications, un nombre proportionnel à n2. La mise à jour f = f*k n'en demande qu'UNE par tour, soit n au total. Pour n=1000, cela fait environ 500000 opérations contre 1000. Le principe est général et se retrouve à l'exercice 5 avec les coefficients binomiaux : quand un terme se déduit du précédent par une opération simple, on ne le recalcule jamais depuis le début.
Le fil de la série est posé dès cet exercice : le programme fournit une valeur approchée, et c'est une INÉGALITÉ démontrée qui dit combien elle vaut. Un résultat numérique sans majoration de l'erreur ne vaut rien au bac.
Coche ici les exercices faits ou à revoir : un compte gratuit, sans mot de passe, retient tes coches et tes réponses justes d'une visite à l'autre, te dit quel chapitre attaquer ensuite et te permet de demander l'exercice qui te manque. Crée ton espace, un courriel suffit.
Exercice 2 : Dichotomie et nombre d'étapes
Soit f définie sur [0;1] par f(x)=ex−3x. On a f(0)=1>0 et f(1)=e−3≈−0,28<0, et l'on admet que f s'annule une seule fois sur cet intervalle, en un réel α.
from math import exp
def f(x):
return exp(x) - 3*x
a = 0
b = 1
while b - a > 0.001:
m = (a + b)/2
if f(a)*f(m) > 0:
a = m
else:
b = m
print(a, b)
a) Détaillez les trois premières étapes : donnez m, le signe de f(m) et le nouvel intervalle.
b) Expliquez le test f(a)*f(m) > 0. Que traduit-il ?
c) Combien d'étapes la boucle effectue-t-elle ? Combien en faudrait-il pour une précision de 10−6 ?
d) Comparez au balayage de pas 10−6 sur [0;1] en nombre de tours.
Voir la correction
Réponses
a)[0,5;1], [0,5;0,75], [0,5;0,625]
b)Même signe en a et m : la racine est dans [m;b]
c)10 étapes ; 20 pour 10−6
d)106 tours contre 20
a)
Étape 1 : m=0,5 et f(0,5)=e0,5−1,5≈0,1487>0, du même signe que f(0), donc la racine est à droite et l'intervalle devient [0,5;1]. Étape 2 : m=0,75 et f(0,75)≈2,117−2,25=−0,133<0, donc l'intervalle devient [0,5;0,75]. Étape 3 : m=0,625 et f(0,625)≈1,8682−1,875=−0,0068<0, donc l'intervalle devient [0,5;0,625]. En trois étapes la longueur est passée de 1 à 0,125.
b)
Un produit de deux nombres est strictement positif si et seulement si ils ont le MÊME signe. Le test f(a)*f(m) > 0 demande donc si f prend le même signe en a et au milieu : dans ce cas la racine ne peut pas se trouver dans [a;m], et l'on remplace a par m. Sinon f change de signe entre a et m, le théorème des valeurs intermédiaires garantit une racine dans cette moitié, et l'on remplace b par m. On conserve ainsi à chaque étape un intervalle contenant α, ce qui est l'INVARIANT de l'algorithme.
c)
La longueur après n étapes vaut 2n1. On veut 2n1≤10−3, soit 2n≥1000 : comme 29=512 et 210=1024, il faut n=10 étapes. Pour 10−6, il faut 2n≥106, et comme 219=524288 et 220=1048576, il faut n=20 étapes. Autrement dit, TRIPLER la précision en nombre de décimales ne double même pas le travail : chaque étape gagne un facteur 2, donc environ 0,3 décimale.
d)
Le balayage de pas 10−6 sur [0;1] demanderait jusqu'à 106 tours, soit un million, contre 20 pour la dichotomie : le rapport est de cinquante mille. La raison est structurelle : le balayage avance de façon ADDITIVE, la dichotomie progresse de façon MULTIPLICATIVE. En contrepartie, la dichotomie exige de connaître un intervalle où la fonction change de signe, alors que le balayage n'exige rien et trouve toutes les racines rencontrées. Le programme donne finalement 0,618<α<0,620, la valeur étant α≈0,6191.
Le fil : la précision d'un algorithme n'est jamais une question d'exécution, c'est une question de MAJORATION connue d'avance. Ici, 2nb−a donne le nombre d'étapes avant même de lancer le programme.
Exercice 3 : Méthode des rectangles et encadrement d'une intégrale
On veut calculer I=∫01e−x2dx. Cette fonction n'a pas de primitive exprimable avec les fonctions du programme : seule une méthode numérique permet d'en approcher la valeur.
On découpe [0;1] en n intervalles de largeur n1 et l'on somme les aires des rectangles appuyés sur l'extrémité gauche, puis sur l'extrémité droite.
a) Écrivez les deux programmes, rect_gauche(n) et rect_droite(n).
b) Justifiez que ces deux sommes ENCADRENT I, et donnez l'encadrement obtenu pour n=10.
c) Exprimez l'écart entre les deux sommes en fonction de n, puis déterminez n pour que cet écart soit inférieur à 10−3.
d) Quelle valeur approchée de I proposez-vous à partir de l'encadrement de la question b), et avec quelle précision ?
Voir la correction
Réponses
a)Deux boucles, sommes divisées par n
b)0,714605≤I≤0,777817
c)Écart n1−e−1 ; n=633
d)I≈0,746211, à 0,0316 près garanti
a)
def rect_gauche(n): puis s = 0 puis for k in range(n): puis s = s + exp(-(k/n)**2) puis return s/n. Pour les rectangles à droite, seule la plage change : for k in range(1, n+1). Chaque rectangle a pour largeur n1 et pour hauteur la valeur de f à l'une des extrémités ; on met la division par n en facteur à la fin plutôt que dans la boucle, ce qui économise n divisions.
b)
La fonction x↦e−x2 est strictement DÉCROISSANTE sur [0;1], puisque x↦−x2 y est décroissante et l'exponentielle croissante. Sur chaque sous-intervalle, la valeur à gauche est donc le maximum de f et la valeur à droite son minimum : le rectangle de gauche contient l'aire sous la courbe, celui de droite est contenu dedans. Par somme, rect_droite(n)≤I≤rect_gauche(n). Pour n=10 on obtient 0,714605≤I≤0,777817.
c)
Les deux sommes ont tous leurs termes communs sauf le premier de l'une et le dernier de l'autre : leur différence vaut n1(f(0)−f(1))=n1−e−1≈n0,632121. Pour n=10 cela donne 0,0632, ce que confirme l'encadrement de b) ✓. On veut n0,632121<10−3, soit n>632,1 : il faut donc n=633 sous-intervalles. Ce chiffre est le point important de l'exercice : l'erreur des rectangles est proportionnelle à n1, donc gagner UNE décimale coûte DIX fois plus de travail.
d)
On propose le milieu de l'encadrement, 20,714605+0,777817≈0,746211, avec une précision au moins égale à la demi-largeur, soit 0,0316. En réalité on fait beaucoup mieux : la valeur exacte est I≈0,746824, donc l'erreur commise n'est que de 6,1×10−4, cinquante fois meilleure que la garantie. Prendre le milieu de deux rectangles revient exactement à la méthode des TRAPÈZES de l'exercice 7, ce qui explique ce gain.
Le fil : l'encadrement n'est pas une commodité, c'est ce qui rend le résultat démontrable. On sait que I est entre deux nombres calculés, et l'écart entre eux, connu par une formule, dit à l'avance combien de rectangles il faut découper.
from math import exp
def rect_gauche(n):
s = 0
for k in range(n):
s = s + exp(-(k/n)**2)
return s/n
def rect_droite(n):
s = 0
for k in range(1, n+1):
s = s + exp(-(k/n)**2)
return s/n
Exercice 4 : Méthode d'Euler et forme explicite
On considère l'équation différentielle y′=−2y+6 avec la condition initiale y(0)=1. La méthode d'Euler de pas h construit la suite yk+1=yk+h(−2yk+6).
a) Écrivez un programme qui affiche y(1) approché par la méthode d'Euler de pas h=0,1, et donnez la valeur obtenue.
b) Montrez que yn=3−2(1−2h)n.
c) Résolvez exactement l'équation différentielle et comparez à la valeur du a), puis à celle obtenue avec h=0,01.
d) Que devient (1−n2)n quand n tend vers +∞ ? Quel résultat cela démontre-t-il sur la méthode ?
Voir la correction
Réponses
a)y(1)≈2,78525
b)yn=3−2(1−2h)n
c)y(1)=3−2e−2≈2,729329 ; Euler h=0,01 : 2,734761
d)Limite e−2 : Euler converge et surestime
a)
h = 0.1 puis y = 1 puis for k in range(10): puis y = y + h*(-2*y + 6) puis print(y). Il faut bien 10 tours pour aller de t=0 à t=1 avec un pas de 0,1, soit h1 tours. Le programme affiche environ 2,78525.
b)
La relation se réécrit yk+1=yk(1−2h)+6h : c'est une suite ARITHMÉTICO-GÉOMÉTRIQUE de raison q=1−2h. Son point fixe L vérifie L=L(1−2h)+6h, soit 2hL=6h et L=3, valeur indépendante de h, ce qui est rassurant. En posant zk=yk−3, on obtient zk+1=zk(1−2h) : la suite (zk) est géométrique de raison 1−2h et de premier terme z0=1−3=−2. D'où zn=−2(1−2h)n puis yn=3−2(1−2h)n. Pour h=0,1 et n=10 : y10=3−2×0,810=3−2×0,1073742≈2,785252 ✓, ce qui confirme l'affichage sans exécuter le programme.
c)
Les solutions de y′=−2y+6 s'écrivent y(t)=Ce−2t+3, la constante 3 étant la solution particulière constante. La condition y(0)=1 donne C+3=1, soit C=−2, d'où y(t)=3−2e−2t. Ainsi y(1)=3−2e−2≈2,729329. Euler avec h=0,1 donnait 2,785252, soit une erreur de 5,6×10−2. Avec h=0,01, c'est-à-dire 100 tours, on obtient 3−2×0,98100≈2,734761, soit une erreur de 5,4×10−3 : diviser le pas par dix a divisé l'erreur par dix. L'erreur de la méthode d'Euler est proportionnelle au pas.
d)
En posant n=h1, la valeur d'Euler en t=1 vaut 3−2(1−n2)n. Or (1−n2)n=exp(nln(1−n2)), et comme ln(1+u)∼u en 0, l'exposant tend vers −2 : la limite est e−2. La méthode d'Euler CONVERGE donc vers la solution exacte quand le pas tend vers zéro, ce qui n'était pas évident a priori. On voit aussi le SENS de l'erreur : puisque 1−x<e−x pour x>0, on a (1−2h)n<e−2, donc yn>y(1), et Euler surestime toujours ici.
Le fil : la méthode d'Euler n'est pas une boîte noire, c'est une suite arithmético-géométrique dont on sait tout écrire. La forme explicite donne la valeur, l'ordre de l'erreur et le sens du biais, sans lancer aucun programme.
h = 0.1
y = 1
for k in range(10):
y = y + h*(-2*y + 6)
print(y)
Exercice 5 : Loi binomiale sans factorielle
Une variable aléatoire X suit la loi binomiale de paramètres n=50 et p=0,3. On veut calculer des probabilités en Python sans passer par des factorielles gigantesques.
a) Démontrez la relation (k+1n)=(kn)×k+1n−k.
b) Écrivez une fonction proba(n, p, k) qui renvoie P(X=k) en utilisant cette relation, et donnez P(X=15) au millionième.
c) Écrivez un programme qui calcule P(X≥20) et donnez sa valeur.
d) Pourquoi évite-t-on d'écrire directement k!(n−k)!n! lorsque n vaut plusieurs centaines ?
Voir la correction
Réponses
a)Quotient des factorielles : k+1n−k
b)P(X=15)≈0,122347
c)P(X≥20)≈0,084803
d)Les factorielles dépassent 10308
a)
On part de la définition : (k+1n)=(k+1)!(n−k−1)!n! et (kn)=k!(n−k)!n!. Le quotient vaut donc (kn)(k+1n)=(k+1)!(n−k−1)!k!(n−k)!. Or (k+1)!=(k+1)×k! et (n−k)!=(n−k)×(n−k−1)!, donc tout se simplifie et il reste k+1n−k, d'où la relation ✓.
b)
def proba(n, p, k): puis c = 1 puis for i in range(k): puis c = c*(n - i)/(i + 1) puis return c*p**k*(1 - p)**(n - k). La boucle applique k fois la relation de a) en partant de (0n)=1. On obtient P(X=15)≈0,122347. La valeur k=15 est aussi l'espérance, E(X)=np=50×0,3=15 : c'est bien la valeur la plus probable, et pourtant elle ne se produit qu'une fois sur huit environ.
c)
s = 0 puis for k in range(20, 51): puis s = s + proba(50, 0.3, k) puis print(s). On trouve P(X≥20)≈0,084803. On peut aussi écrire P(X≥20)=1−P(X≤19), ce qui demande vingt termes au lieu de trente et un : à résultat égal, on choisit la somme la plus courte. Attention à la borne : range(20, 51) doit aller jusqu'à 50 INCLUS, sans quoi il manque un terme.
d)
Parce que les factorielles explosent : 200! compte plus de trois cent soixante chiffres. Python sait manipuler de tels entiers exactement, mais lentement, et surtout le passage aux flottants pour multiplier par pk provoque un dépassement de capacité, la plage des flottants s'arrêtant vers 10308. La formule récursive, elle, ne manipule que des nombres de taille raisonnable, car elle alterne multiplications et divisions : le coefficient reste toujours proche de sa valeur finale. C'est la même idée qu'à l'exercice 1 avec la factorielle mise à jour d'un tour à l'autre.
Le fil : une formule mathématiquement correcte peut être numériquement inutilisable. La réécrire en récurrence ne change rien au résultat exact, mais rend le calcul possible, et c'est exactement ce que le programme de Terminale appelle un algorithme efficace.
def proba(n, p, k):
c = 1
for i in range(k):
c = c*(n - i)/(i + 1)
return c*p**k*(1 - p)**(n - k)
s = 0
for k in range(20, 51):
s = s + proba(50, 0.3, k)
print(s)
Partie B : problèmes et raisonnement (/50)
Exercice 6 : Méthode de Newton et convexité
Pour approcher 7, on applique la méthode de Newton à la fonction f(x)=x2−7 : partant de x0=3, on remplace à chaque étape xk par l'abscisse du point où la TANGENTE à la courbe en xk coupe l'axe des abscisses.
a) Montrez que la relation de récurrence s'écrit xk+1=21(xk+xk7), et écrivez le programme correspondant.
b) Calculez x1, x2 et x3, puis comparez à 7≈2,645751311. Combien de décimales exactes gagne-t-on par étape ?
c) La fonction f est convexe sur ]0;+∞[. Que peut-on en déduire sur la position de la tangente, et donc sur le sens de variation de la suite ?
d) Combien d'étapes de dichotomie faudrait-il, en partant de [2;3], pour atteindre la précision de x3 ?
Voir la correction
Réponses
a)xk+1=21(xk+xk7)
b)38, 2,645833, 2,645751312 : décimales doublées
c)Suite décroissante minorée par 7
d)30 étapes de dichotomie
a)
La tangente en xk a pour équation y=f′(xk)(x−xk)+f(xk), soit y=2xk(x−xk)+xk2−7. Elle coupe l'axe des abscisses lorsque y=0, donc x=xk−2xkxk2−7=2xk2xk2−xk2+7=2xkxk2+7=21(xk+xk7) ✓. Le programme s'écrit x = 3 puis for k in range(3): puis x = (x + 7/x)/2 puis print(x). On reconnaît la moyenne de xk et de xk7, deux nombres dont le produit vaut toujours 7 : si l'un est trop grand, l'autre est trop petit, et leur moyenne est meilleure que les deux.
b)
x1=21(3+37)=21×316=38≈2,666667, puis x2≈2,645833, puis x3≈2,645751312. Les erreurs valent respectivement 2,1×10−2, 8,2×10−5 et 1,2×10−9 : le nombre de décimales exactes DOUBLE à chaque étape. C'est la convergence dite quadratique, sans commune mesure avec la dichotomie, qui n'en gagne que 0,3 par étape.
c)
f′′(x)=2>0, donc f est convexe et sa courbe est au-DESSUS de chacune de ses tangentes. En particulier, la tangente en xk coupe l'axe des abscisses AVANT que la courbe ne le fasse, du côté où l'on vient : pour xk>7, on obtient xk+1>7. La suite reste donc minorée par 7 à partir du rang 0, et l'on vérifie qu'elle est décroissante : xk−xk+1=2xkxk2−7>0 dès que xk>7. Décroissante et minorée, elle converge, et sa limite L vérifie L=21(L+L7), donc L2=7 et L=7. La convexité est ce qui rend la démonstration possible.
d)
La dichotomie sur [2;3] donne après n étapes une précision de 2n1. Pour atteindre 1,2×10−9, il faut 2n≥1,2×10−91≈8,3×108, soit n=30 étapes, contre TROIS pour Newton. La contrepartie est que Newton exige la dérivée et un point de départ correct, alors que la dichotomie ne demande qu'un changement de signe et ne peut pas échouer.
Le fil : ici encore l'algorithme seul ne prouve rien. C'est la convexité qui garantit que la suite reste du bon côté, et c'est la monotonie plus la minoration qui démontrent la convergence. Le programme se contente d'afficher les décimales.
x = 3
for k in range(3):
x = (x + 7/x)/2
print(x)
Exercice 7 : Compléter un programme : la méthode des trapèzes
On reprend I=∫01e−x2dx. La méthode des trapèzes remplace chaque rectangle par le trapèze dont les deux côtés verticaux valent f aux deux extrémités du sous-intervalle.
Le programme suivant la met en oeuvre. Trois éléments sont incomplets.
La figure représente quatre trapèzes, pour n=4.
from math import exp
def f(x):
return exp(-x*x)
def trapezes(n):
h = 1/n
s = ...
for k in range(1, n):
s = s + ...
return ...
print(trapezes(10))
a) Complétez les trois éléments du programme, en justifiant l'aire d'un trapèze.
b) Donnez la valeur obtenue pour n=10, sachant que I≈0,74682413. Quelle est l'erreur ?
c) La valeur pour n=20 vaut 0,74667084. Comparez les deux erreurs et concluez sur l'ordre de la méthode.
d) Montrez que la méthode des trapèzes donne exactement la moyenne des deux sommes de rectangles de l'exercice 3. Pourquoi est-elle bien meilleure que chacune d'elles ?
Voir la correction
Réponses
a)s = (f(0) + f(1))/2, s = s + f(k*h), return s*h
b)0,74621080, erreur ≈6,13×10−4
c)Erreur divisée par 4 : ordre h2
d)Moyenne des rectangles : 0,746211
a)
Un trapèze de hauteur h et de bases f(xk) et f(xk+1) a pour aire h×2f(xk)+f(xk+1). En sommant sur tous les sous-intervalles, chaque valeur intérieure apparaît DEUX fois, une fois comme base droite et une fois comme base gauche, alors que f(0) et f(1) n'apparaissent qu'une fois. On complète donc par s = (f(0) + f(1))/2, puis s = s + f(k*h) dans la boucle, puis return s*h. C'est la formule classique : les extrémités comptent pour moitié, les points intérieurs pour un.
b)
Le programme affiche 0,74621080. L'erreur vaut ∣0,74621080−0,74682413∣≈6,13×10−4. À comparer avec l'exercice 3 : les rectangles à gauche donnaient 0,777817, soit une erreur de 3,1×10−2, cinquante fois plus grande pour exactement le même nombre d'évaluations de f.
c)
Pour n=20, l'erreur vaut ∣0,74667084−0,74682413∣≈1,53×10−4. Le rapport des deux erreurs vaut 1,53×10−46,13×10−4≈4 : DOUBLER le nombre de sous-intervalles a divisé l'erreur par QUATRE, et non par deux. L'erreur des trapèzes est donc proportionnelle à h2, alors que celle des rectangles est proportionnelle à h. Pour gagner une décimale, il suffit de multiplier n par un peu plus de trois, contre dix pour les rectangles.
d)
La somme des rectangles à gauche vaut h(f(x0)+f(x1)+⋯+f(xn−1)) et celle des rectangles à droite h(f(x1)+⋯+f(xn)). Leur moyenne vaut h(2f(x0)+f(xn)+f(x1)+⋯+f(xn−1)), ce qui est exactement la formule des trapèzes ✓. Pour n=10 on retrouve bien 20,777817+0,714605=0,746211. Le gain s'explique simplement : les deux sommes de rectangles se trompent en sens CONTRAIRES, l'une par excès et l'autre par défaut, et d'à peu près la même quantité. En prenant la moyenne, les deux erreurs se compensent en grande partie, et il ne reste que l'effet de la COURBURE de f, d'où l'ordre h2.
Le fil : améliorer un algorithme ne veut pas dire faire plus de tours, mais mieux utiliser les mêmes valeurs. Les trapèzes n'évaluent pas f plus souvent que les rectangles, ils se contentent de la combiner intelligemment.
from math import exp
def f(x):
return exp(-x*x)
def trapezes(n):
h = 1/n
s = (f(0) + f(1))/2
for k in range(1, n):
s = s + f(k*h)
return s*h
print(trapezes(10))
Exercice 8 : Cinq affirmations à corriger
Chacune des cinq affirmations suivantes est FAUSSE. Dites pourquoi, puis énoncez la version correcte.
a) « Si un programme de dichotomie renvoie un encadrement, c'est la preuve que la fonction est continue sur l'intervalle. »
b) « La méthode d'Euler donne la valeur exacte de la solution dès que le pas est assez petit. »
c) « Pour la méthode des rectangles comme pour celle des trapèzes, doubler n divise l'erreur par quatre. »
d) « Pour calculer P(X=k) d'une loi binomiale avec n=500, on écrit directement le quotient de factorielles. »
e) « La méthode de Newton converge quel que soit le point de départ. »
Voir la correction
Réponses
a)Faux : la continuité est une hypothèse
b)Faux : Euler converge sans être exacte
c)Faux : rectangles en h, trapèzes en h2
d)Faux : coefficients de proche en proche
e)Faux : Newton peut diverger
a)
FAUX. Le programme ne teste RIEN d'autre que des signes : il divise l'intervalle en deux et compare des produits, opérations qui ont un résultat même pour une fonction discontinue. Sur x↦x−0,51, qui change de signe en 0,5 sans s'y annuler, la dichotomie sur [0;1] renverrait un encadrement de 0,5, où la fonction n'est même pas définie. Version correcte : « la continuité est une HYPOTHÈSE à vérifier avant d'appliquer le théorème des valeurs intermédiaires, et c'est lui, non le programme, qui garantit l'existence d'une racine ».
b)
FAUX. Pour tout pas h>0 fixé, la méthode d'Euler commet une erreur non nulle : l'exercice 4 la calcule exactement, yn=3−2(1−2h)n contre 3−2e−2. Version correcte : « la méthode d'Euler CONVERGE vers la solution exacte quand le pas tend vers 0, mais tout calcul effectif se fait avec un pas fixé, donc avec une erreur non nulle ». Diviser le pas par dix divise l'erreur par dix, sans jamais l'annuler.
c)
FAUX, seuls les trapèzes ont ce comportement. L'erreur des rectangles est proportionnelle au pas h, donc doubler n ne la divise que par DEUX ; celle des trapèzes est proportionnelle à h2, donc doubler n la divise par quatre. C'est exactement ce qu'on mesure à l'exercice 7. Version correcte : « rectangles, erreur en h ; trapèzes, erreur en h2 ». Le mot d'ordre du chapitre est là : on ne compare pas deux méthodes sur un seul essai, on regarde comment l'erreur RÉAGIT quand on raffine.
d)
FAUX. 500! est un entier de plus de mille chiffres ; Python le calcule exactement, mais le convertir en flottant pour le multiplier par pk dépasse la capacité des nombres à virgule flottante, dont le maximum est de l'ordre de 10308. Version correcte : « on calcule les coefficients binomiaux de proche en proche par (k+1n)=(kn)×k+1n−k, ce qui garde tous les nombres manipulés dans une plage raisonnable ».
e)
FAUX. Newton peut diverger, osciller, ou s'arrêter net si f′(xk)=0, puisque l'on divise par la dérivée. Sur f(x)=x2−7 partant de x0=0, la tangente est horizontale et ne coupe jamais l'axe. Version correcte : « la convergence de Newton est GARANTIE sous des hypothèses de convexité et de bon choix du point de départ, comme à l'exercice 6, mais n'a rien d'automatique ». C'est le prix de sa rapidité, là où la dichotomie, plus lente, ne peut pas échouer.
Ces cinq erreurs disent la même chose : un algorithme ne démontre rien par lui-même. Il produit des nombres, et ce sont les théorèmes d'analyse, valeurs intermédiaires, convexité, majoration du reste, qui disent ce que ces nombres valent.
Exercice 9 : Charge d'un condensateur et méthode d'Euler
Un condensateur de capacité C=1,0μF se charge à travers une résistance R=2,0 kΩ sous une tension E=5,0 V. La tension u à ses bornes vérifie τu′+u=E avec τ=RC, et u(0)=0.
On approche cette évolution par la méthode d'Euler : uk+1=uk+hτE−uk.
a) Calculez τ en millisecondes, puis écrivez le programme donnant u(τ) avec un pas h=0,2 ms.
b) Montrez que un=E(1−(1−τh)n), et donnez la valeur obtenue au a).
c) Résolvez exactement l'équation différentielle, donnez u(τ) et comparez aux résultats d'Euler pour h=0,2 ms puis h=0,02 ms.
d) Au bout de combien de temps la tension atteint-elle 99% de E ? Dans quel sens la méthode d'Euler se trompe-t-elle ici, et pourquoi ?
Voir la correction
Réponses
a)τ=2,0 ms, 10 tours
b)un=E(1−qn) ; u10≈3,2566 V
c)u(τ)≈3,1606 V ; Euler h=0,02 : 3,1698 V
d)t≈9,2 ms ; Euler surestime
a)
τ=RC=2,0×103×1,0×10−6=2,0×10−3 s, soit 2,0 ms. Il faut donc 0,22,0=10 tours pour aller de 0 à τ. Le programme s'écrit tau = 2.0 puis h = 0.2 puis u = 0 puis for k in range(10): puis u = u + h*(5 - u)/tau puis print(u), toutes les durées étant exprimées en millisecondes, ce qui est licite puisque seul le RAPPORT τh intervient.
b)
La relation se réécrit uk+1=uk(1−τh)+τhE, suite arithmético-géométrique de raison q=1−τh. Son point fixe vérifie L=Lq+τhE, soit Lτh=τhE et L=E, ce qui est physiquement attendu : le condensateur chargé atteint la tension du générateur. En posant zk=uk−E, on obtient zk+1=qzk avec z0=−E, donc zn=−Eqn et un=E(1−qn) ✓. Pour h=0,2 ms : q=0,9 et u10=5(1−0,910)=5×0,651322≈3,2566 V.
c)
L'équation u′=τE−u a pour solutions u(t)=E+Ke−t/τ, et la condition u(0)=0 donne K=−E, d'où u(t)=E(1−e−t/τ). Donc u(τ)=5(1−e−1)≈3,1606 V, ce qui est le résultat classique : à t=τ, le condensateur est chargé à 63%. Euler avec h=0,2 ms donnait 3,2566 V, soit une erreur de 9,6×10−2 V ; avec h=0,02 ms, c'est-à-dire 100 tours, on obtient 5(1−0,99100)≈3,1698 V, soit une erreur de 9,2×10−3 V. L'erreur a bien été divisée par dix comme le pas.
d)
On résout E(1−e−t/τ)=0,99E, soit e−t/τ=0,01, donc τt=ln100 et t=τln100≈2,0×4,605≈9,2 ms. C'est la règle usuelle en électronique : la charge est pratiquement terminée au bout de cinq constantes de temps. Quant au sens de l'erreur, Euler SURESTIME la tension : puisque 1−x<e−x pour x>0, on a qn=(1−τh)n<e−1, donc un>u(τ). L'explication physique est la même qu'en radioactivité : sur chaque pas, Euler applique la vitesse de charge du DÉBUT de l'intervalle, or cette vitesse diminue à mesure que u se rapproche de E. On charge donc trop vite.
Le fil : une équation différentielle linéaire du premier ordre et une suite arithmético-géométrique sont le même objet, l'une continue et l'autre discrète. Passer de l'une à l'autre donne la valeur, l'ordre de l'erreur et son signe, ce qu'aucune exécution de programme ne fournirait.
tau = 2.0
h = 0.2
u = 0
for k in range(10):
u = u + h*(5 - u)/tau
print(u)
Exercice 10 : Problème de synthèse : suivi cinétique d'une réaction
On suit la disparition d'un réactif A par spectrophotométrie. On relève la concentration en mol/L aux instants suivants, exprimés en minutes : t = [0, 10, 20, 30, 40] et c = [0.100, 0.061, 0.037, 0.022, 0.014].
On veut décider si la réaction est d'ordre 1, c'est-à-dire si dtdc=−kc, puis en déduire la constante de vitesse et le temps de demi-réaction.
a) Écrivez un programme qui affiche les logarithmes népériens des concentrations puis leurs écarts successifs. Que constate-t-on, et que peut-on en conclure ?
b) Déduisez-en la constante de vitesse k à partir des valeurs extrêmes, puis le temps de demi-réaction t1/2.
c) La quantité de A consommée par litre entre 0 et 40 min vaut ∫040kc(t)dt. Calculez-la par la méthode des trapèzes sur les cinq points, et comparez à c(0)−c(40).
d) L'écart trouvé au c) est-il un défaut des mesures ou de la méthode ? Dans quel sens se trompe la méthode des trapèzes ici ?
Voir la correction
Réponses
a)Écarts de lnc presque constants : ordre 1
b)k≈0,0492 min−1, t1/2≈14,1 min
c)Trapèzes : ≈0,0870 mol/L contre 0,086
d)Défaut de méthode : surestimation par convexité
a)
from math import log puis L = [] puis for x in c: puis L.append(log(x)), puis une seconde boucle for i in range(1, len(L)): puis print(L[i] - L[i-1]). On obtient les logarithmes −2,3026, −2,7969, −3,2968, −3,8167, −4,2687, et les écarts successifs −0,4943, −0,5000, −0,5199, −0,4520. Ces écarts sont pratiquement CONSTANTS, aux incertitudes de mesure près : lnc est donc une fonction affine du temps, ce qui caractérise l'ordre 1. En effet, c(t)=c0e−kt donne lnc(t)=lnc0−kt, une droite de pente −k. Un ordre 2 aurait donné c1 affine, et c'est ce test de linéarisation, plutôt que l'allure de la courbe, qui tranche.
b)
La pente vaut 40lnc(40)−lnc(0)=40−4,2687+2,3026=40−1,9661≈−0,04915, donc k≈0,0492 min−1. Le temps de demi-réaction vérifie c(t1/2)=2c0, soit e−kt1/2=21 et t1/2=kln2≈0,049150,6931≈14,1 min. Ce résultat est cohérent avec le tableau : la concentration passe de 0,100 à 0,050 entre les relevés de 10 et 20 minutes. Pour un ordre 1, t1/2 ne dépend PAS de la concentration initiale, propriété que l'on vérifie ici en constatant que la concentration est encore divisée par deux, à peu près, entre 14 et 28 minutes.
c)
Les valeurs de la vitesse v=kc valent 0,004915, 0,002998, 0,001819, 0,001081 et 0,000688 mol/(L⋅min). La formule des trapèzes avec h=10 min donne 10×(20,004915+0,000688+0,002998+0,001819+0,001081)=10×0,008700≈0,0870 mol/L. La valeur attendue est c(0)−c(40)=0,100−0,014=0,086 mol/L. L'écart relatif vaut 0,0860,0870−0,086≈1,2%, ce qui valide à la fois le modèle et l'intégration.
d)
C'est essentiellement un défaut de la MÉTHODE, et son sens est prévisible. La fonction t↦kc0e−kt est convexe, puisque sa dérivée seconde k3c0e−kt est positive : sa courbe est donc au-dessous de chacune de ses cordes, et chaque trapèze, construit sur une corde, RECOUVRE l'aire réelle. La méthode surestime, ce que l'on constate ✓. Un pas de 10 minutes est d'ailleurs grossier face à un temps de demi-réaction de 14 minutes : avec des relevés toutes les 5 minutes, l'erreur serait divisée par quatre, l'erreur des trapèzes étant proportionnelle au carré du pas comme à l'exercice 7. Les incertitudes de mesure, elles, jouent aussi, mais dans un sens imprévisible, alors que la convexité impose un biais systématique dans un seul sens.
Le fil de la série se referme ici : linéariser pour identifier le modèle, majorer pour garantir la précision, et connaître la convexité pour savoir DANS QUEL SENS on se trompe. Ces trois gestes sont ceux que l'épreuve de spécialité et celle de physique-chimie évaluent l'une comme l'autre.
from math import log
t = [0, 10, 20, 30, 40]
c = [0.100, 0.061, 0.037, 0.022, 0.014]
for i in range(1, len(c)):
print(log(c[i]) - log(c[i-1]))
k = (log(c[0]) - log(c[4]))/40
print(k, log(2)/k)
Partie C : les classiques (/50)
Exercice 11 : La série harmonique et son seuil
On pose Hn=1+21+31+⋯+n1=∑k=1nk1 pour n≥1. On admet que la suite (Hn) tend vers +∞.
def seuil(A):
n = 0
H = 0
while H <= A:
n = n + 1
H = H + 1/n
return n
a) Calculez H4 sous forme de fraction irréductible.
b) Écrivez une fonction seuil(A) qui renvoie le plus petit entier n tel que Hn>A.
c) Que renvoient seuil(3) et seuil(5) ?
d) On admet que ln(n+1)≤Hn≤1+lnn. Déduisez-en un encadrement du plus petit n tel que Hn>10, et expliquez pourquoi le programme est alors peu adapté.
Voir la correction
Réponses
a)H4=1225
b)Boucle while H <= A, n incrémenté avant d'ajouter n1
c)11 et 83
d)Entre 8104 et 22026 (en fait 12367)
a)
H4=1+21+31+41=1212+6+4+3=1225≈2,083.
b)
Deux accumulateurs : n compte les termes, H accumule la somme. On ajoute un terme TANT QUE la somme ne dépasse pas le seuil : def seuil(A): puis n = 0 puis H = 0 puis while H <= A: puis n = n + 1 puis H = H + 1/n puis return n. L'ordre des deux lignes de la boucle compte : on incrémente n AVANT d'ajouter n1, sinon on diviserait par zéro au premier tour.
c)
seuil(3) renvoie 11, car H10≈2,929≤3 et H11≈3,020>3. seuil(5) renvoie 83, avec H83≈5,002. Passer de 3 à 5 multiplie déjà le nombre de termes par plus de sept.
d)
Si Hn>10, alors 1+lnn≥Hn>10, donc lnn>9 et n>e9≈8103. Inversement, dès que ln(n+1)>10, c'est-à-dire n+1>e10≈22026, on a Hn>10. Le seuil est donc compris entre 8104 et 22026 (il vaut en fait 12367). Le programme s'en sort encore, mais pour Hn>50 il faudrait de l'ordre de e50≈5×1021 tours : des milliers d'années de calcul. La série diverge si lentement que le balayage devient inutilisable, et c'est l'encadrement par le logarithme qui répond.
Un algorithme de seuil ne termine que si la suite dépasse vraiment le seuil, ce qu'il faut DÉMONTRER avant de lancer la boucle : ici, c'est la divergence admise de (Hn). Et même quand il termine, un encadrement mathématique permet souvent de prévoir le résultat, ou de savoir qu'on ne l'obtiendra pas en temps raisonnable.
Exercice 12 : La suite de Fibonacci dans une liste
On définit u0=1, u1=1 et, pour tout entier naturel n, un+2=un+1+un.
On complète le programme ci-dessous, qui construit la liste des termes de u0 à uN.
def fibo(N):
L = [1, 1]
for n in range(2, N + 1):
...
return L
a) Complétez la ligne manquante du programme.
b) Que valent u10 et u20 ?
c) Calculez u19u20 au millionième et comparez au nombre d'or φ=21+5.
d) Que renvoie sum(fibo(9)), et vérifiez la relation u0+u1+⋯+u9=u11−1.
Voir la correction
Réponses
a)L.append(L[-1] + L[-2])
b)u10=89, u20=10946
c)≈1,618034=φ
d)143=u11−1
a)
La liste commence par [1, 1] et chaque nouveau terme est la somme des DEUX derniers : L.append(L[-1] + L[-2]). En Python, L[-1] désigne le dernier élément de la liste et L[-2] l'avant-dernier, ce qui évite de manipuler des indices.
b)
Les termes successifs sont 1,1,2,3,5,8,13,21,34,55,89 : u10=89. En poursuivant, u19=6765 et u20=10946. Attention au décalage d'indice : la liste fibo(10) contient ONZE termes, de u0 à u10.
c)
u19u20=676510946≈1,618034, et φ≈1,618034 : les six premières décimales coïncident. On peut montrer que si le rapport unun+1 converge vers ℓ>0, alors ℓ=1+ℓ1, soit ℓ2−ℓ−1=0, dont la racine positive est exactement φ.
d)
fibo(9) est la liste de u0 à u9, dont la somme vaut 1+1+2+3+5+8+13+21+34+55=143. Et u11=144, donc u11−1=143 ✓. La relation se démontre par récurrence : si ∑k=0nuk=un+2−1, alors ∑k=0n+1uk=un+2−1+un+1=un+3−1.
Une liste Python permet de garder TOUS les termes, là où une boucle avec deux variables ne garde que les deux derniers. Le choix dépend de la question : pour une somme ou un tracé, la liste ; pour un seul terme de rang élevé, deux variables suffisent et économisent la mémoire.
def fibo(N):
L = [1, 1]
for n in range(2, N + 1):
L.append(L[-1] + L[-2])
return L
print(fibo(20)[20], sum(fibo(9)))
Exercice 13 : Estimer π par la méthode de Monte-Carlo
On choisit au hasard un point M(x;y) dans le carré [0;1]×[0;1], x et y étant tirés indépendamment et uniformément. On note p la probabilité que M soit dans le quart de disque de centre O et de rayon 1, c'est-à-dire que x2+y2≤1.
from random import random
def estimation_pi(n):
c = 0
for k in range(n):
x = random()
y = random()
...
return ...
a) Justifiez que p=4π et donnez-en une valeur approchée au millième.
b) Complétez le programme pour qu'il renvoie une estimation de π à partir de n points.
c) Un essai avec n=10000 donne 7836 points dans le quart de disque. Quelle estimation de π obtient-on ?
d) On note Fn la fréquence des points dans le quart de disque. D'après l'inégalité de concentration, P(∣Fn−p∣≥δ)≤nδ2p(1−p). Quelle valeur de n garantit P(∣Fn−p∣≥0,01)≤0,05 ?
Voir la correction
Réponses
a)p=4π≈0,785
b)Compter les points avec x2+y2≤1, renvoyer 4*c/n
c)π≈3,1344
d)n≥33710
a)
Le tirage étant uniforme dans le carré d'aire 1, la probabilité d'une zone est son aire. Le quart de disque de rayon 1 a pour aire 4π×12=4π. Donc p=4π≈0,785.
b)
On compte les points qui tombent dans le quart de disque, puis on multiplie la fréquence par 4 : dans la boucle, if x**2 + y**2 <= 1: puis c = c + 1, et à la fin return 4*c/n. La fonction random() du module random renvoie un nombre au hasard dans [0;1[.
c)
La fréquence vaut 100007836=0,7836, d'où l'estimation π≈4×0,7836=3,1344. L'erreur est d'environ 0,007 : on n'a que deux décimales exactes avec dix mille points.
d)
p(1−p)=4π(1−4π)≈0,1685. On veut n×0,0120,1685≤0,05, soit n≥0,05×0,00010,1685≈33710. Il faut au moins 33710 points pour avoir la fréquence à 0,01 près avec un risque d'au plus 5%, c'est-à-dire π à 0,04 près seulement. En pratique on majore souvent p(1−p) par 41, ce qui donne 50000 points sans connaître p.
La méthode de Monte-Carlo transforme un calcul d'aire en simulation, et elle a l'avantage de marcher en toute dimension. Son défaut est sa lenteur : l'erreur ne décroît qu'en n1, si bien que gagner une décimale coûte cent fois plus de points. C'est pourquoi on la réserve aux problèmes où les méthodes déterministes, rectangles ou trapèzes, deviennent impraticables.
from random import random
def estimation_pi(n):
c = 0
for k in range(n):
x = random()
y = random()
if x**2 + y**2 <= 1:
c = c + 1
return 4*c/n
Exercice 14 : Le point fixe du cosinus
On cherche le réel α de [0;1] tel que cosα=α. On pose g(x)=cosx−x.
a) Montrez que g est strictement décroissante sur [0;1] et que l'équation cosx=x y a une unique solution α.
b) On considère la suite u0=1, un+1=cos(un). Calculez u1, u2 et u3 au dix-millième.
c) On admet que la suite converge vers α et qu'il faut 32 itérations pour que ∣un−α∣≤10−6. Donnez α au millionième.
d) La méthode de Newton appliquée à g s'écrit xk+1=xk−−sinxk−1cosxk−xk. Partant de x0=1, calculez x1 et x2 au millionième.
e) Combien d'itérations de Newton suffisent pour atteindre la précision de c), sachant que x3≈0,739085133 ?
Voir la correction
Réponses
a)g′(x)=−sinx−1<0 ; g(0)>0>g(1)
b)0,5403 ; 0,8576 ; 0,6543
c)α≈0,739085
d)x1≈0,750364, x2≈0,739113
e)3 itérations
a)
g′(x)=−sinx−1. Sur [0;1], sinx≥0, donc g′(x)≤−1<0 : g est strictement décroissante. g est continue, g(0)=1>0 et g(1)=cos1−1≈−0,46<0 : par le corollaire du théorème des valeurs intermédiaires, g s'annule une unique fois sur [0;1].
b)
En radians : u1=cos1≈0,5403 ; u2=cos(0,5403)≈0,8576 ; u3=cos(0,8576)≈0,6543. Les termes oscillent autour de la limite en se resserrant : la suite n'est pas monotone, parce que le cosinus est DÉCROISSANT sur [0;1]. Oublier de mettre la calculatrice en radians donne cos1≈0,9998 et une suite qui ne converge pas vers la bonne valeur.
c)
α≈0,739085, nombre parfois appelé nombre de Dottie. Trente-deux itérations pour six décimales : chaque itération divise l'écart par environ ∣sinα∣≈0,67, ce qui fait gagner moins de 0,2 décimale par tour.
d)
x1=1−−sin1−1cos1−1=1−−1,841471−0,459698≈1−0,249636=0,750364. Puis x2≈0,739113. L'erreur est déjà inférieure à 3×10−5 au deuxième pas.
e)
∣x3−α∣ est de l'ordre de 10−10 : TROIS itérations suffisent, contre 32 pour le point fixe. Newton double le nombre de décimales exactes à chaque étape ; le point fixe n'en gagne qu'une fraction constante. En contrepartie, Newton demande la dérivée et un bon point de départ.
Trois algorithmes résolvent la même équation cosx=x : la dichotomie (un bit par étape, sûre), le point fixe (une fraction de décimale par étape, simple à programmer), Newton (décimales doublées à chaque étape, rapide mais exigeante). Choisir entre eux est une question d'analyse : monotonie, dérivée, point de départ.
Exercice 15 : Simuler la somme de deux dés
On lance deux dés équilibrés à six faces et l'on note S la somme des deux faces. On simule n lancers avec le programme ci-dessous.
from random import randint
def frequence7(n):
c = 0
for k in range(n):
...
return ...
a) Déterminez P(S=7), puis E(S) en utilisant S=D1+D2.
b) Sachant que V(D1)=1235, calculez V(S) en justifiant.
c) Complétez le programme pour qu'il renvoie la fréquence des sommes égales à 7 sur n lancers.
d) Pour n=1000, majorez P(Fn−61≥0,05) à l'aide de l'inégalité de concentration.
e) Une simulation de 1000 lancers donne 91 sommes égales à 7. Ce résultat est-il surprenant ? Quelle erreur de programme pourrait l'expliquer ?
e)Écart 0,076≥0,05 : très suspect, fréquence proche de 111
a)
Sur les 36 couples équiprobables, 6 donnent 7 : (1,6), (2,5), (3,4), (4,3), (5,2), (6,1). P(S=7)=366=61. Par linéarité de l'espérance, E(S)=E(D1)+E(D2)=3,5+3,5=7.
b)
Les deux dés sont INDÉPENDANTS, donc la variance de la somme est la somme des variances : V(S)=1235+1235=635≈5,833. Sans l'indépendance, cette additivité serait fausse ; l'espérance, elle, s'additionne toujours.
c)
Dans la boucle : s = randint(1, 6) + randint(1, 6), puis if s == 7: et c = c + 1. En sortie : return c/n. Tirer UN nombre entre 2 et 12 avec randint(2, 12) serait faux : les onze sommes ne sont pas équiprobables.
d)
nδ2p(1−p)=1000×0,05261×65=2,50,1389≈0,0556. La probabilité que la fréquence s'écarte de 61 d'au moins 0,05 est au plus d'environ 5,6%.
e)
La fréquence observée vaut 0,091, et 0,091−61≈0,076≥0,05. D'après d), un écart d'au moins 0,05 a une probabilité d'au plus 5,6% si le programme est juste : le résultat est très suspect. Or 0,091 est presque exactement 111≈0,0909, la fréquence qu'on obtiendrait avec randint(2, 12), qui rend les onze sommes équiprobables. L'erreur de c) est la coupable probable.
Simuler ne remplace pas le calcul : il sert à le CONTRÔLER. On calcule d'abord la loi, l'espérance et la variance, puis l'inégalité de concentration dit quel écart entre fréquence simulée et probabilité est normal. Un écart trop grand signale une erreur de programme plus souvent qu'une erreur de calcul.
from random import randint
def frequence7(n):
c = 0
for k in range(n):
s = randint(1, 6) + randint(1, 6)
if s == 7:
c = c + 1
return c/n
Partie D : les autres algorithmes du programme (/50)
Exercice 16 : La méthode de la sécante
On cherche la solution α de l'équation xex=1, c'est-à-dire le zéro de f(x)=xex−1 sur [0;1]. La méthode de la sécante part de deux valeurs x0=0 et x1=1 ; à chaque étape, elle trace la CORDE qui joint les points de la courbe d'abscisses xk−1 et xk, et prend pour xk+1 l'abscisse du point où cette corde coupe l'axe des abscisses.
La figure montre la courbe, la corde [M0M1] qui donne x2, puis la corde [M2M1] qui donne x3. Le programme ci-dessous est incomplet.
from math import exp
def f(x):
return x*exp(x) - 1
def secante(a, b, n):
for k in range(n):
c = ...
a = b
b = c
return b
a) Démontrez que l'équation f(x)=0 admet une unique solution α dans [0;1].
b) Démontrez que la corde passant par (a;f(a)) et (b;f(b)) coupe l'axe des abscisses au point d'abscisse c=b−f(b)f(b)−f(a)b−a. Calculez x2 en valeur exacte, puis au millième.
c) Complétez la ligne c = ... du programme. Que se passerait-il si l'on inversait les deux lignes a = b et b = c ?
d) Le programme affiche successivement x3≈0,503314, x4≈0,578616, x5≈0,566532, x6≈0,567138 et x7≈0,5671433, alors que α≈0,5671433. À partir de quel rang l'erreur est-elle inférieure à 10−6 ? Combien d'étapes faudrait-il à la dichotomie sur [0;1] pour la même précision ?
e) Expliquez en quoi la méthode de la sécante est une méthode de Newton dans laquelle on a remplacé f′(xk) par un taux d'accroissement. Quel avantage en tire-t-on ?
Voir la correction
Réponses
a)f′(x)=(1+x)ex>0, f(0)<0<f(1) : une unique solution
b)c=b−f(b)f(b)−f(a)b−a ; x2=e1≈0,368
c)c = b - f(b)*(b - a)/(f(b) - f(a)) ; lignes inversées : a=b, division par zéro
d)Rang 7 ; 20 étapes de dichotomie
e)Newton avec f′(xk) remplacé par la pente de la corde : pas besoin de f′, un seul calcul de f par étape
a)
f est dérivable sur [0;1] et f′(x)=ex+xex=(1+x)ex>0 : f est continue et strictement croissante. De plus f(0)=−1<0 et f(1)=e−1≈1,718>0. D'après le théorème des valeurs intermédiaires, appliqué à une fonction continue strictement monotone, l'équation f(x)=0 admet une unique solution α dans [0;1]. C'est ce qui autorise à parler de LA solution vers laquelle l'algorithme doit converger.
b)
La corde a pour coefficient directeur le taux d'accroissement m=b−af(b)−f(a) et passe par (b;f(b)) : son équation est y=f(b)+m(x−b). Elle coupe l'axe quand y=0, soit x−b=−mf(b), c'est-à-dire c=b−f(b)f(b)−f(a)b−a, à condition que f(b)=f(a). Avec a=0 et b=1 : x2=1−(e−1)×(e−1)−(−1)1−0=1−ee−1=e1≈0,368. Contrôle sur la figure : la première corde coupe l'axe un peu avant 0,4 ✓. On est encore loin de α : la courbe est convexe, et la corde passe au-dessus.
c)
La ligne à écrire est la formule de b) : c = b - f(b)*(b - a)/(f(b) - f(a)). Ensuite, le couple (a;b) doit devenir (b;c) : les deux DERNIERS points calculés. L'ordre des deux affectations compte. Si l'on écrit b = c d'abord, l'ancienne valeur de b est perdue, et a = b copie la NOUVELLE valeur : on obtient a=b=c. Au tour suivant, f(b)−f(a)=0 et le programme s'arrête sur une division par zéro. C'est le même piège que l'affectation simultanée des deux termes de la suite de Fibonacci à l'exercice 12.
d)
Les erreurs valent environ 0,064 pour x3, 0,011 pour x4, 6,1×10−4 pour x5, 5,7×10−6 pour x6 et 2,9×10−9 pour x7 : la précision 10−6 est atteinte au rang 7, et pas avant, puisque 5,7×10−6>10−6. Le nombre de décimales exactes passe de 1 à 3, puis 5, puis 8 : chaque étape en gagne environ autant que les deux précédentes réunies. Pour la dichotomie, l'intervalle mesure 2n1 après n étapes, et 2n1≤10−6 demande n=20, puisque 219<106≤220, comme à l'exercice 2. La sécante fait donc en six cordes ce que la dichotomie fait en vingt coupes.
e)
La méthode de Newton de l'exercice 6 pose xk+1=xk−f′(xk)f(xk) : elle suit la TANGENTE. La sécante pose xk+1=xk−f(xk)×f(xk)−f(xk−1)xk−xk−1 : c'est la même formule, où le nombre dérivé f′(xk) est remplacé par le taux d'accroissement entre les deux derniers points, c'est-à-dire la pente d'une corde au lieu de celle d'une tangente. L'avantage : on n'a jamais besoin de connaître f′, et chaque étape ne coûte qu'UN nouveau calcul de f, la valeur précédente étant réutilisée. On paie ce confort d'une convergence un peu moins rapide que celle de Newton, mais bien plus rapide que la dichotomie.
Ce qui décide de la vitesse d'un algorithme de résolution, c'est l'information qu'il exploite : le SIGNE seul pour la dichotomie, une pente de corde pour la sécante, la dérivée pour Newton.
from math import exp
def f(x):
return x*exp(x) - 1
def secante(a, b, n):
for k in range(n):
c = b - f(b)*(b - a)/(f(b) - f(a))
a = b
b = c
return b
Exercice 17 : L'algorithme de Brouncker pour ln 2
En 1668, William Brouncker calcule l'aire sous l'hyperbole d'équation y=1+x1 entre 0 et 1. Il la remplit de rectangles de plus en plus fins : la figure montre les quatre premiers, d'aires 21, 121, puis deux plus petits. Il en tire la somme Sn=1×21+3×41+5×61+⋯+(2n−1)×2n1, que calcule le programme ci-dessous.
def brouncker(n):
s = 0
for k in range(1, n + 1):
s = s + 1/((2*k - 1)*(2*k))
return s
a) Calculez ∫011+tdt. Sur la figure, vérifiez que le rectangle posé sur [0;41] entre les hauteurs 32 et 54 a pour aire 5×61.
b) Démontrez que (2k−1)×2k1=2k−11−2k1. Déduisez-en Sn=1−21+31−41+⋯−2n1, puis calculez S3 sous forme de fraction.
c) Pour t∈[0;1], justifiez que 1−t+t2−⋯−t2n−1=1+t1−t2n. En intégrant, démontrez que Sn=ln2−Rn, où Rn=∫011+tt2ndt.
d) Démontrez que 0≤Rn≤2n+11. Déduisez-en la limite de (Sn), et la plus petite valeur de n qui GARANTIT ln2−Sn≤10−3.
e) Le programme renvoie S500≈0,6926474, et ln2≈0,6931472. Comparez l'erreur réelle à la majoration de d). Combien de termes la majoration demande-t-elle pour une erreur de 10−6 ? Concluez sur la vitesse de l'algorithme.
Voir la correction
Réponses
a)ln2≈0,693 ; rectangle 41×152=301
b)Sn=1−21+⋯−2n1 ; S3=6037
c)Somme géométrique de raison −t ; Sn=ln2−Rn
d)0≤Rn≤2n+11 ; Sn→ln2 par défaut ; n=500
e)Erreur ≈5,0×10−4, moitié de la borne ; 500000 termes pour 10−6 : algorithme lent
a)
∫011+tdt=[ln(1+t)]01=ln2−ln1=ln2 : l'aire que Brouncker remplit est ln2≈0,693. Le rectangle a pour largeur 41 et pour hauteur 54−32=1512−10=152, donc pour aire 41×152=301=5×61. Les hauteurs sont des valeurs de l'hyperbole : 1+1/21=32 et 1+1/41=54. De même, le grand rectangle vaut 1×21=1×21 et celui du dessus 21×(32−21)=121=3×41 : chaque terme de Sn est l'aire d'un rectangle de la figure.
b)
2k−11−2k1=(2k−1)×2k2k−(2k−1)=(2k−1)×2k1. En sommant pour k de 1 à n, chaque terme de Sn se dédouble en un terme positif d'indice impair et un terme négatif d'indice pair : Sn=1−21+31−41+⋯+2n−11−2n1, qui compte 2n termes. Pour n=3 : S3=21+121+301=6030+5+2=6037≈0,617. Contrôle par l'autre écriture : 1−21+31−41+51−61=6037 ✓.
c)
Le membre de gauche est la somme des 2n premiers termes d'une suite géométrique de premier terme 1 et de raison −t, avec −t=1 : elle vaut 1−(−t)1−(−t)2n=1+t1−t2n, puisque (−t)2n=t2n, l'exposant étant pair. On intègre les deux membres entre 0 et 1. À gauche, ∫01tjdt=j+11 donne exactement 1−21+31−⋯−2n1=Sn. À droite, par linéarité, ∫011+tdt−∫011+tt2ndt=ln2−Rn. Donc Sn=ln2−Rn.
d)
Sur [0;1], t2n≥0 et 1+t≥1, donc 0≤1+tt2n≤t2n. On intègre, bornes dans l'ordre croissant : 0≤Rn≤∫01t2ndt=2n+11. Par les gendarmes, Rn→0, donc Sn→ln2 ; et comme Rn≥0, Sn≤ln2 : l'algorithme approche ln2 PAR DÉFAUT. Pour garantir ln2−Sn=Rn≤10−3, il suffit que 2n+11≤10−3, soit 2n+1≥1000, n≥499,5 : n=500.
e)
L'erreur réelle vaut 0,6931472−0,6926474≈5,0×10−4, soit la MOITIÉ de la majoration 10011≈10−3 : la borne est honnête, à un facteur 2 près. En fait l'erreur se comporte comme 4n1. Pour 10−6, la majoration demande 2n+11≤10−6, soit n≥499999,5 : un demi-million de termes. L'algorithme est juste mais LENT : l'erreur décroît comme n1, et chaque décimale supplémentaire coûte dix fois plus de termes. L'algorithme de Briggs, à l'exercice suivant, fait bien mieux.
À retenir : pour majorer l'erreur d'un algorithme, on écrit la quantité cherchée comme la valeur calculée plus un RESTE, et l'on majore le reste, ici par une intégrale.
Exercice 18 : L'algorithme de Briggs pour calculer un logarithme
En 1617, Henry Briggs calcule ses tables de logarithmes en extrayant des racines carrées successives. On adapte sa méthode au calcul de ln3. On pose y0=3 et, pour tout entier naturel k, yk+1=yk. On admet l'inégalité lnx≤x−1 pour tout x>0, établie par concavité du logarithme.
from math import sqrt
def briggs(a, k):
y = a
for i in range(k):
y = sqrt(y)
return 2**k*(1 - 1/y), 2**k*(y - 1)
a) Démontrez par récurrence que lnyk=2kln3 pour tout entier naturel k. Que devient yk quand k grandit ?
b) En appliquant l'inégalité admise à x1, démontrez que lnx≥1−x1 pour tout x>0. Déduisez-en que 2k(1−yk1)≤ln3≤2k(yk−1), et expliquez ce que renvoie briggs(3, k).
c) briggs(3, 10) renvoie 1,0980232 et 1,0992018. Donnez la largeur de l'encadrement, et les décimales de ln3 qu'il garantit.
d) Démontrez que la largeur de l'encadrement vaut yk2k(yk−1)2. Sachant que yk−1 est voisin de 2kln3, justifiez que chaque racine supplémentaire divise la largeur par 2 environ. Quelle valeur de k faut-il pour une largeur au plus 10−6 ? On donne (ln3)2≈1,207.
e) briggs(3, 40) renvoie deux fois 1,0983887, et briggs(3, 53) renvoie deux fois 0. Expliquez ces résultats, sachant que la machine ne garde qu'environ 16 chiffres significatifs.
Voir la correction
Réponses
a)lnyk=2kln3 ; yk→1
b)1−x1≤lnx≤x−1, d'où 2k(1−yk1)≤ln3≤2k(yk−1) : un minorant et un majorant
c)Largeur ≈1,179×10−3 ; ln3=1,09…, deux décimales garanties
d)Largeur yk2k(yk−1)2≈2k(ln3)2 ; k=21
e)yk−1 noyé dans l'arrondi : bornes fausses à k=40, nulles à k=53
a)
Initialisation : lny0=ln3=20ln3 ✓. Hérédité : si lnyk=2kln3, alors lnyk+1=lnyk=21lnyk, puisque lnyk=ln(yk×yk)=2lnyk ; donc lnyk+1=2k+1ln3 ✓. Conclusion : la propriété vaut pour tout k. Quand k grandit, lnyk tend vers 0, donc yk=elnyk tend vers e0=1 par continuité de l'exponentielle. Toute l'idée de Briggs est là : ramener le calcul de ln3 à celui du logarithme d'un nombre TRÈS proche de 1, où la courbe se confond presque avec sa tangente y=x−1.
b)
Pour x>0, x1>0, et l'inégalité admise donne lnx1≤x1−1, soit −lnx≤x1−1, et lnx≥1−x1. On a donc 1−x1≤lnx≤x−1. Avec x=yk et a) : 1−yk1≤2kln3≤yk−1, et en multipliant par 2k>0 : 2k(1−yk1)≤ln3≤2k(yk−1). La fonction briggs calcule yk par k racines carrées, puis renvoie les deux bornes : un MINORANT et un MAJORANT garantis de ln3, sans jamais appeler de logarithme.
c)
La largeur vaut 1,0992018−1,0980232≈1,179×10−3. Les deux bornes commencent par 1,09 : l'encadrement garantit 1,098<ln3<1,100, donc les deux premières décimales, ln3=1,09… ; la troisième hésite encore entre 8 et 9. La valeur vraie, ln3≈1,0986123, est bien entre les deux.
d)
Largeur : 2k(yk−1)−2k(1−yk1)=2k(yk−2+yk1)=2kykyk2−2yk+1=yk2k(yk−1)2. Avec yk≈1 et yk−1≈2kln3, la largeur est voisine de 2k×4k(ln3)2=2k(ln3)2 : passer de k à k+1 la divise par 2. Contrôle en c) : 10241,207≈1,18×10−3 ✓. Pour une largeur au plus 10−6, il faut 2k≥1,207×106 ; or 220=1048576 est trop petit et 221=2097152 convient : k=21 racines carrées. À comparer au demi-million de termes de Brouncker pour une précision voisine.
e)
Pour k=40, yk−1≈2401,1≈10−12. La machine stocke yk avec environ 16 chiffres significatifs, c'est-à-dire 1,000000000001… : il ne reste que quatre chiffres utiles pour yk−1, et l'erreur d'arrondi, multipliée par 240≈1012, devient visible dès la quatrième décimale. Les deux bornes sont même égales, alors que la largeur exacte serait de l'ordre de 10−12 : l'encadrement ment. Pour k=53, yk est si proche de 1 que la machine l'arrondit à 1 exactement, et les deux bornes valent 0. Augmenter k améliore les MATHÉMATIQUES de l'encadrement mais dégrade le CALCUL : au-delà d'une vingtaine de racines, on perd plus en arrondi qu'on ne gagne en précision. Briggs, qui calculait à la main avec trente chiffres, n'avait pas cette limite au même endroit.
Un algorithme a donc deux limites : la vitesse que lui donnent les mathématiques, et la précision que lui laisse la machine.
Exercice 19 : La méthode des milieux et l'encadrement par la concavité
On veut approcher I=∫0π/2cosxdx. La méthode des milieux découpe [0;2π] en n intervalles de largeur h=2nπ, et remplace la courbe, sur chacun, par le rectangle dont la hauteur est la valeur de cos au MILIEU de l'intervalle. On note Mn la somme obtenue, et Tn celle de la méthode des trapèzes de l'exercice 7. La figure montre M2.
from math import cos, pi
def milieux(n):
h = (pi/2)/n
s = 0
for k in range(n):
s = s + ...
return h*s
a) Calculez I. Calculez M2 au millième, avec cos8π≈0,92388 et cos83π≈0,38268.
b) Complétez la ligne s = s + ... du programme.
c) Le programme donne M4≈1,006455 et M8≈1,001608. Calculez les deux erreurs et leur rapport. Qu'en déduisez-vous sur la méthode ?
d) Sur un intervalle [a;b] de milieu m, justifiez que le rectangle de hauteur cosm a la même aire que le trapèze situé sous la TANGENTE en m. En utilisant la concavité de cos sur [0;2π], démontrez que Tn≤I≤Mn. Avec T8≈0,996785, donnez l'encadrement de I obtenu sans connaître I.
e) Avec T2≈0,948059, comparez les erreurs de M2 et de T2. Calculez 32M2+T2 et son erreur. Commentez.
Voir la correction
Réponses
a)I=1 ; M2≈1,026
b)s = s + cos((k + 0.5)*h)
c)Erreurs 6,455×10−3 et 1,608×10−3, rapport 4 : erreur en h2
d)Rectangle du milieu = trapèze sous la tangente ; cos concave, donc Tn≤I≤Mn ; 0,996785≤I≤1,001608
e)Erreur des trapèzes ≈−2× celle des milieux ; 32M2+T2≈1,000134, erreur 1,3×10−4
a)
I=[sinx]0π/2=sin2π−sin0=1. Pour n=2, h=4π et les milieux sont 8π et 83π : M2=4π(cos8π+cos83π)≈0,785398×1,30656≈1,026. L'erreur est déjà de l'ordre de 2,6×10−2 avec deux rectangles seulement.
b)
Le k-ième intervalle est [kh;(k+1)h], de milieu (k+21)h : on complète par s = s + cos((k + 0.5)*h). Écrire cos(k*h) donnerait les rectangles à gauche de l'exercice 3, qui surestiment ici largement, cos étant décroissante.
c)
Erreurs : M4−1≈6,455×10−3 et M8−1≈1,608×10−3, de rapport 1,6086,455≈4,0. Doubler n divise l'erreur par QUATRE : comme pour les trapèzes, l'erreur des milieux est proportionnelle à h2, alors que celle des rectangles à gauche est proportionnelle à h. Avec les mêmes huit valeurs de cos, les rectangles à gauche se trompent d'environ 0,095, soixante fois plus.
d)
Sur [a;b], la tangente en m est une droite ; le trapèze sous cette droite a pour aire (b−a)× la moyenne des hauteurs aux extrémités, et pour une droite cette moyenne est la hauteur au MILIEU, c'est-à-dire cosm : même aire que le rectangle. Or cos′′(x)=−cosx≤0 sur [0;2π] : cos y est CONCAVE, donc sa courbe est au-dessous de ses tangentes et au-dessus de ses cordes. Sous la courbe, il y a donc moins d'aire que sous la tangente, soit moins que le rectangle du milieu, et plus que sous la corde, soit plus que le trapèze. En sommant sur les n intervalles : Tn≤I≤Mn. La figure du corrigé montre les deux droites pour n=1 : la tangente en 4π en trait plein, la corde en pointillés. Pour n=8 : 0,996785≤I≤1,001608, un encadrement GARANTI de largeur 5×10−3, obtenu sans connaître la primitive.
e)
M2−1≈+0,0262 et T2−1≈−0,0519 : l'erreur des trapèzes est environ le DOUBLE de celle des milieux, et de signe contraire, ce qui confirme d). La combinaison 32M2+T2=32×1,026172+0,948059≈1,000134 fait disparaître presque toute l'erreur : il reste 1,3×10−4, avec seulement deux intervalles. Cette moyenne pondérée, la méthode de Simpson, est au-delà du programme, mais elle montre ce que valent les erreurs quand on connaît leur SIGNE : deux méthodes qui se trompent en sens contraires s'encadrent, puis se corrigent l'une l'autre.
La concavité ne sert pas qu'à tracer une courbe : elle dit de quel CÔTÉ chaque méthode se trompe, et transforme deux valeurs approchées en un encadrement certain.
from math import cos, pi
def milieux(n):
h = (pi/2)/n
s = 0
for k in range(n):
s = s + cos((k + 0.5)*h)
return h*s
Exercice 20 : La planche de Galton et le triangle de Pascal dans une liste
Une planche de Galton compte 6 rangées de clous. Une bille lâchée en haut rebondit sur un clou de chaque rangée et part à droite avec la probabilité 21, à gauche sinon, indépendamment des autres rebonds ; elle tombe enfin dans l'une des 7 boîtes numérotées de 0 à 6, le numéro étant le nombre de rebonds à droite. La figure montre le trajet d'une bille : droite, gauche, droite, droite, gauche, droite.
Le programme ci-dessous simule la planche et construit les lignes du triangle de Pascal.
from random import random
def galton(n):
k = 0
for i in range(n):
if random() < 0.5:
k = k + 1
return k
def ligne_pascal(n):
L = [1]
for i in range(n):
L = [1] + [L[j] + L[j + 1] for j in range(len(L) - 1)] + [1]
return L
def simulation(n, N):
boites = [0]*(n + 1)
for b in range(N):
k = galton(n)
boites[k] = boites[k] + 1
return boites
a) Que représente la valeur renvoyée par galton(6) ? Justifiez qu'elle suit une loi binomiale dont vous donnerez les paramètres, puis calculez la probabilité que la bille tombe dans la boîte 0.
b) Donnez le contenu de la liste L après chacun des tours de boucle de ligne_pascal(4). Quelle relation la compréhension programme-t-elle ? Que renvoie ligne_pascal(6) ?
c) Expliquez pourquoi le nombre de trajets menant à la boîte k est (k6). Calculez la probabilité qu'une bille tombe dans la boîte 3, puis dans l'une des boîtes 2, 3 ou 4.
d) simulation(6, 640) a renvoyé la liste [10, 63, 155, 197, 141, 63, 11]. Donnez les effectifs théoriques, puis la fréquence observée de la boîte 3 et celle des boîtes 2 à 4. Comparez.
e) On incline la planche : chaque rebond part à droite avec la probabilité 0,6. Quelle ligne du programme faut-il modifier ? Quelle est alors la boîte la plus probable, et avec quelle probabilité ?
Voir la correction
Réponses
a)Le numéro de la boîte ; X∼B(6;21) ; P(X=0)=641
c)(k6) trajets de probabilité 641 ; P(X=3)=0,3125 ; P(2≤X≤4)=0,78125
d)10, 60, 150, 200, 150, 60, 10 ; 0,308 contre 0,3125 ; 0,770 contre 0,781
e)if random() < 0.6 ; boîte 4, P(X=4)≈0,311
a)
La variable k part de 0 et augmente de 1 chaque fois que random() < 0.5, ce qui arrive avec la probabilité 21 : galton(6) renvoie le nombre de rebonds à droite sur les 6 rangées, c'est-à-dire le NUMÉRO DE LA BOÎTE. Chaque rebond est une épreuve de Bernoulli de succès « à droite », de probabilité 21 ; les 6 rebonds sont identiques et indépendants. Le numéro X de la boîte compte les succès : X suit la loi binomiale B(6;21). La boîte 0 exige six rebonds à gauche : P(X=0)=(21)6=641≈0,016.
b)
L vaut [1] au départ, puis [1, 1] après le premier tour, [1, 2, 1] après le deuxième, [1, 3, 3, 1] après le troisième et [1, 4, 6, 4, 1] après le quatrième. La compréhension ajoute deux termes VOISINS de la ligne précédente, L[j] + L[j + 1], et encadre le tout par deux 1 : c'est la relation de Pascal, (j+1i+1)=(ji)+(j+1i). En poursuivant, ligne_pascal(6) renvoie [1, 6, 15, 20, 15, 6, 1], dont la somme vaut 64=26. L'indice de la liste est le numéro de la boîte : L[3] vaut 20, pour la boîte 3.
c)
Un trajet est une suite de 6 choix « droite » ou « gauche » ; il mène à la boîte k s'il compte exactement k « droite ». Choisir les rangées où la bille part à droite, c'est choisir k rangées parmi 6 : il y a (k6) trajets. On le voit aussi sur la planche : pour atteindre un clou, la bille arrive du clou de gauche ou du clou de droite de la rangée du dessus, et les nombres de trajets s'ajoutent, exactement comme dans la compréhension. Les 26=64 trajets ont chacun la probabilité 641, donc P(X=3)=6420=0,3125 et P(2≤X≤4)=6415+20+15=6450=0,78125.
d)
Les effectifs théoriques valent 640×64(k6)=10×(k6) : 10, 60, 150, 200, 150, 60 et 10. La somme observée vaut bien 640. Fréquence de la boîte 3 : 640197≈0,308, contre 0,3125 ; boîtes 2 à 4 : 640155+197+141=640493≈0,770, contre 0,781. Les écarts, de l'ordre du centième, sont ceux d'un échantillon de 640 billes : une simulation ne reproduit jamais exactement la loi, elle la FLUCTUE autour. Relancée, elle donnerait d'autres effectifs, voisins eux aussi. La forme en cloche, symétrique autour de la boîte 3, est en revanche nette.
e)
Seul le test change : if random() < 0.6: donne un succès avec la probabilité 0,6. Alors X suit B(6;0,6), et P(X=k)=(k6)0,6k0,46−k : 0,138 pour k=2, 0,276 pour k=3, 0,311 pour k=4 et 0,187 pour k=5. La boîte la plus probable est la 4, avec P(X=4)=15×0,64×0,42=15×0,1296×0,16≈0,311. L'espérance np=3,6 n'est pas un numéro de boîte, mais la cloche s'est bien déplacée vers la droite. La liste de Pascal ne suffit plus : les trajets ne sont plus équiprobables, et chacun pèse 0,6k0,46−k.
La planche de Galton rend visible la loi binomiale : les coefficients de Pascal COMPTENT les chemins, les probabilités de chaque rebond les PÈSENT, et la simulation montre la fluctuation autour.
Il manque quelque chose dans cette série ?Un type d'exercice que ton prof donne, un énoncé qui te bloque, une erreur repérée : dis-le-moi, je lis chaque demande.
L'envoi passe par ton espace gratuit : c'est ce qui me permet de te répondre et de te prévenir quand l'exercice est ajouté. Un courriel suffit, pas de mot de passe. Crée ton espace.
Pas envie de créer un compte ? Écris-moi directement.
Ce chapitre au bac 2025 et 2026
22 exercices des sujets officiels le mobilisent, avec leur corrigé détaillé. Le meilleur entraînement une fois la série faite.
Vous cherchez un tuteur de spécialité maths en Terminale à Montréal ?
Contactez-moi pour une première séance. On travaille sur des exercices calibrés sur le niveau réel des contrôles au Lycée Marie de France et au Collège Stanislas.