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.

Série autocorrigée Tape tes réponses sous chaque 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.

Ce chapitre fait partie de Spécialité mathématiques en Terminale
Avant de commencer Fiche de révision : les pièges et la méthode de ce chapitre

Avant ce chapitre

Ces notions sont supposées acquises ici. Si le premier exercice résiste, le blocage vient presque toujours de l'une d'elles, pas du chapitre lui-même.

Remonter plus loin : la chaîne complète (8 chapitres) ↓

Le chemin de remédiation, du plus ancien au plus proche. Un élève qui reprend ce chapitre de zéro le reprend dans cet ordre.

  1. 1Généralités sur les fonctionsSeconde
  2. 2Algorithmique et PythonSeconde
  3. 3Les suites numériquesPremière
  4. 4Python en spécialité mathsPremière
  5. 5Suites et récurrence
  6. 6Algorithmique et ScratchQuatrième
  7. 7La notion de fonctionTroisième
  8. 8Algorithmique et ScratchTroisième

Rappel de cours

  • 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 22, donc après nn étapes elle vaut ba2n\frac{b-a}{2^{\,n}}.
  • Pour ff monotone sur [a;b][a\,;b], les rectangles à gauche et à droite ENCADRENT l'intégrale, et l'écart entre les deux vaut (ba)f(b)f(a)n\frac{(b-a)\left|f(b)-f(a)\right|}{n}.
  • Méthode d'Euler pour y=ay+by'=ay+b : yk+1=yk+h(ayk+b)y_{k+1}=y_k+h\left(ay_k+b\right), soit une suite arithmético-géométrique de raison 1+ah1+ah.
  • Méthode de Newton : xk+1=xkf(xk)f(xk)x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)}, c'est-à-dire l'abscisse où la tangente coupe l'axe des abscisses.
  • Loi binomiale : P(X=k)=(nk)pk(1p)nkP(X=k)=\binom{n}{k}p^{\,k}(1-p)^{\,n-k}, et (nk+1)=(nk)×nkk+1\binom{n}{k+1}=\binom{n}{k}\times\frac{n-k}{k+1}.
  • 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.

Partie A : les bases (/50)

Exercice 1 : Approcher le nombre e et majorer le reste

On admet que e=k=0+1k!e=\sum_{k=0}^{+\infty}\frac{1}{k!}, et l'on pose Sn=k=0n1k!S_n=\sum_{k=0}^{n}\frac{1}{k!}. On veut calculer SnS_n 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 S5S_5 au millionième.
  • b) Que vaut S10S_{10} ? Comparez à e2,718281828e\approx 2{,}718281828.
  • c) On admet la majoration 0<eSn<1n×n!0<e-S_n<\frac{1}{n\times n!}. Vérifiez-la pour n=10n=10.
  • d) Pourquoi met-on `f = f*k` à jour dans la boucle plutôt que de recalculer k!k! à chaque tour ?

Tape tes réponses, la page te dit juste ou faux 0/4

a)
b)
c)
d)
Voir la correction

Réponses

  • a) `f` contient k!k! ; S52,716667S_{5}\approx 2{,}716667
  • b) S102,7182818S_{10}\approx 2{,}7182818, écart 2,7×108\approx 2{,}7\times 10^{-8}
  • c) 110×10!2,756×108\frac{1}{10\times 10!}\approx 2{,}756\times 10^{-8} majore l'écart
  • d) Une multiplication par tour au lieu de kk

a) La variable `f` contient la factorielle du rang courant : elle vaut 11 pour k=0k=0, puis elle est multipliée par kk à chaque nouveau tour, ce qui donne successivement 11, 11, 22, 66, 2424, 120120. On accumule donc 10!+11!++15!=1+1+0,5+0,16+0,0416+0,0083\frac{1}{0!}+\frac{1}{1!}+\dots+\frac{1}{5!}=1+1+0{,}5+0{,}1\overline{6}+0{,}041\overline{6}+0{,}008\overline{3}, soit S52,716667S_5\approx 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, 00 et 11.

b) On obtient S102,7182818011S_{10}\approx 2{,}7182818011, à comparer à e2,7182818285e\approx 2{,}7182818285. Les huit premières décimales coïncident, et l'écart vaut environ 2,7×1082{,}7\times 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=10n=10 : 10!=362880010!=3\,628\,800, donc 110×10!=1362880002,756×108\frac{1}{10\times 10!}=\frac{1}{36\,288\,000}\approx 2{,}756\times 10^{-8}. L'écart réellement constaté, 2,731×1082{,}731\times 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 ee, 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!k! à chaque tour demande kk multiplications, donc au total 1+2++n=n(n+1)21+2+\dots+n=\frac{n(n+1)}{2} multiplications, un nombre proportionnel à n2n^2. La mise à jour `f = f*k` n'en demande qu'UNE par tour, soit nn au total. Pour n=1000n=1000, cela fait environ 500000500\,000 opérations contre 10001000. 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.

Exercice 2 : Dichotomie et nombre d'étapes

Soit ff définie sur [0;1][0\,;1] par f(x)=ex3xf(x)=e^{x}-3x. On a f(0)=1>0f(0)=1>0 et f(1)=e30,28<0f(1)=e-3\approx -0{,}28<0, et l'on admet que ff s'annule une seule fois sur cet intervalle, en un réel α\alpha.

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 mm, le signe de f(m)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 10610^{-6} ?
  • d) Comparez au balayage de pas 10610^{-6} sur [0;1][0\,;1] en nombre de tours.

Tape tes réponses, la page te dit juste ou faux 0/6

a)
Intervalle après l'étape 3 ;
b)
c)
d)
Voir la correction

Réponses

  • a) [0,5;1][0{,}5;1], [0,5;0,75][0{,}5;0{,}75], [0,5;0,625][0{,}5;0{,}625]
  • b) Même signe en aa et mm : la racine est dans [m;b][m;b]
  • c) 1010 étapes ; 2020 pour 10610^{-6}
  • d) 10610^{6} tours contre 2020

a) Étape 1 : m=0,5m=0{,}5 et f(0,5)=e0,51,50,1487>0f(0{,}5)=e^{0{,}5}-1{,}5\approx 0{,}1487>0, du même signe que f(0)f(0), donc la racine est à droite et l'intervalle devient [0,5;1][0{,}5\,;1]. Étape 2 : m=0,75m=0{,}75 et f(0,75)2,1172,25=0,133<0f(0{,}75)\approx 2{,}117-2{,}25=-0{,}133<0, donc l'intervalle devient [0,5;0,75][0{,}5\,;0{,}75]. Étape 3 : m=0,625m=0{,}625 et f(0,625)1,86821,875=0,0068<0f(0{,}625)\approx 1{,}8682-1{,}875=-0{,}0068<0, donc l'intervalle devient [0,5;0,625][0{,}5\,;0{,}625]. En trois étapes la longueur est passée de 11 à 0,1250{,}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 ff prend le même signe en aa et au milieu : dans ce cas la racine ne peut pas se trouver dans [a;m][a\,;m], et l'on remplace aa par mm. Sinon ff change de signe entre aa et mm, le théorème des valeurs intermédiaires garantit une racine dans cette moitié, et l'on remplace bb par mm. On conserve ainsi à chaque étape un intervalle contenant α\alpha, ce qui est l'INVARIANT de l'algorithme.

c) La longueur après nn étapes vaut 12n\frac{1}{2^{\,n}}. On veut 12n103\frac{1}{2^{\,n}}\le 10^{-3}, soit 2n10002^{\,n}\ge 1000 : comme 29=5122^{9}=512 et 210=10242^{10}=1024, il faut n=10n=10 étapes. Pour 10610^{-6}, il faut 2n1062^{\,n}\ge 10^{6}, et comme 219=5242882^{19}=524\,288 et 220=10485762^{20}=1\,048\,576, il faut n=20n=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 22, donc environ 0,30{,}3 décimale.

d) Le balayage de pas 10610^{-6} sur [0;1][0\,;1] demanderait jusqu'à 10610^{6} tours, soit un million, contre 2020 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,6200{,}618<\alpha<0{,}620, la valeur étant α0,6191\alpha\approx 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, ba2n\frac{b-a}{2^{\,n}} 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=01ex2dxI=\int_{0}^{1}e^{-x^{2}}\,dx. 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][0\,;1] en nn intervalles de largeur 1n\frac{1}{n} 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 II, et donnez l'encadrement obtenu pour n=10n=10.
  • c) Exprimez l'écart entre les deux sommes en fonction de nn, puis déterminez nn pour que cet écart soit inférieur à 10310^{-3}.
  • d) Quelle valeur approchée de II proposez-vous à partir de l'encadrement de la question b), et avec quelle précision ?

Tape tes réponses, la page te dit juste ou faux 0/4

b)
c)
d)
Voir la correction

Réponses

  • a) Deux boucles, sommes divisées par nn
  • b) 0,714605I0,7778170{,}714605\leq I\leq 0{,}777817
  • c) Écart 1e1n\frac{1-e^{-1}}{n} ; n=633n=633
  • d) I0,746211I\approx 0{,}746211, à 0,03160{,}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 1n\frac{1}{n} et pour hauteur la valeur de ff à l'une des extrémités ; on met la division par nn en facteur à la fin plutôt que dans la boucle, ce qui économise nn divisions.

b) La fonction xex2x\mapsto e^{-x^{2}} est strictement DÉCROISSANTE sur [0;1][0\,;1], puisque xx2x\mapsto -x^2 y est décroissante et l'exponentielle croissante. Sur chaque sous-intervalle, la valeur à gauche est donc le maximum de ff 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)Irect_gauche(n)\text{rect\_droite}(n)\le I\le \text{rect\_gauche}(n). Pour n=10n=10 on obtient 0,714605I0,7778170{,}714605\le I\le 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 1n(f(0)f(1))=1e1n0,632121n\frac{1}{n}\left(f(0)-f(1)\right)=\frac{1-e^{-1}}{n}\approx\frac{0{,}632121}{n}. Pour n=10n=10 cela donne 0,06320{,}0632, ce que confirme l'encadrement de b) ✓. On veut 0,632121n<103\frac{0{,}632121}{n}<10^{-3}, soit n>632,1n>632{,}1 : il faut donc n=633n=633 sous-intervalles. Ce chiffre est le point important de l'exercice : l'erreur des rectangles est proportionnelle à 1n\frac{1}{n}, donc gagner UNE décimale coûte DIX fois plus de travail.

d) On propose le milieu de l'encadrement, 0,714605+0,77781720,746211\frac{0{,}714605+0{,}777817}{2}\approx 0{,}746211, avec une précision au moins égale à la demi-largeur, soit 0,03160{,}0316. En réalité on fait beaucoup mieux : la valeur exacte est I0,746824I\approx 0{,}746824, donc l'erreur commise n'est que de 6,1×1046{,}1\times 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 II 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
0.20.40.60.810.20.40.60.811.21.41.6rectangles a gauche : 0,7778integrale : 0,7468f decroissante : les rectangles majorent

Exercice 4 : Méthode d'Euler et forme explicite

On considère l'équation différentielle y=2y+6y'=-2y+6 avec la condition initiale y(0)=1y(0)=1. La méthode d'Euler de pas hh construit la suite yk+1=yk+h(2yk+6)y_{k+1}=y_k+h\left(-2y_k+6\right).

  • a) Écrivez un programme qui affiche y(1)y(1) approché par la méthode d'Euler de pas h=0,1h=0{,}1, et donnez la valeur obtenue.
  • b) Montrez que yn=32(12h)ny_n=3-2\left(1-2h\right)^{n}.
  • c) Résolvez exactement l'équation différentielle et comparez à la valeur du a), puis à celle obtenue avec h=0,01h=0{,}01.
  • d) Que devient (12n)n\left(1-\frac{2}{n}\right)^{n} quand nn tend vers ++\infty ? Quel résultat cela démontre-t-il sur la méthode ?

Tape tes réponses, la page te dit juste ou faux 0/5

a)
c)
d)
Voir la correction

Réponses

  • a) y(1)2,78525y(1)\approx 2{,}78525
  • b) yn=32(12h)ny_{n}=3-2(1-2h)^{n}
  • c) y(1)=32e22,729329y(1)=3-2e^{-2}\approx 2{,}729329 ; Euler h=0,01h=0{,}01 : 2,7347612{,}734761
  • d) Limite e2e^{-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 1010 tours pour aller de t=0t=0 à t=1t=1 avec un pas de 0,10{,}1, soit 1h\frac{1}{h} tours. Le programme affiche environ 2,785252{,}78525.

b) La relation se réécrit yk+1=yk(12h)+6hy_{k+1}=y_k(1-2h)+6h : c'est une suite ARITHMÉTICO-GÉOMÉTRIQUE de raison q=12hq=1-2h. Son point fixe LL vérifie L=L(12h)+6hL=L(1-2h)+6h, soit 2hL=6h2hL=6h et L=3L=3, valeur indépendante de hh, ce qui est rassurant. En posant zk=yk3z_k=y_k-3, on obtient zk+1=zk(12h)z_{k+1}=z_k(1-2h) : la suite (zk)(z_k) est géométrique de raison 12h1-2h et de premier terme z0=13=2z_0=1-3=-2. D'où zn=2(12h)nz_n=-2(1-2h)^{n} puis yn=32(12h)ny_n=3-2(1-2h)^{n}. Pour h=0,1h=0{,}1 et n=10n=10 : y10=32×0,810=32×0,10737422,785252y_{10}=3-2\times 0{,}8^{10}=3-2\times 0{,}1073742\approx 2{,}785252 ✓, ce qui confirme l'affichage sans exécuter le programme.

c) Les solutions de y=2y+6y'=-2y+6 s'écrivent y(t)=Ce2t+3y(t)=Ce^{-2t}+3, la constante 33 étant la solution particulière constante. La condition y(0)=1y(0)=1 donne C+3=1C+3=1, soit C=2C=-2, d'où y(t)=32e2ty(t)=3-2e^{-2t}. Ainsi y(1)=32e22,729329y(1)=3-2e^{-2}\approx 2{,}729329. Euler avec h=0,1h=0{,}1 donnait 2,7852522{,}785252, soit une erreur de 5,6×1025{,}6\times 10^{-2}. Avec h=0,01h=0{,}01, c'est-à-dire 100100 tours, on obtient 32×0,981002,7347613-2\times 0{,}98^{100}\approx 2{,}734761, soit une erreur de 5,4×1035{,}4\times 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=1hn=\frac{1}{h}, la valeur d'Euler en t=1t=1 vaut 32(12n)n3-2\left(1-\frac{2}{n}\right)^{n}. Or (12n)n=exp(nln(12n))\left(1-\frac{2}{n}\right)^{n}=\exp\left(n\ln\left(1-\frac{2}{n}\right)\right), et comme ln(1+u)u\ln(1+u)\sim u en 00, l'exposant tend vers 2-2 : la limite est e2e^{-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 1x<ex1-x<e^{-x} pour x>0x>0, on a (12h)n<e2(1-2h)^{n}<e^{-2}, donc yn>y(1)y_n>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 XX suit la loi binomiale de paramètres n=50n=50 et p=0,3p=0{,}3. On veut calculer des probabilités en Python sans passer par des factorielles gigantesques.

  • a) Démontrez la relation (nk+1)=(nk)×nkk+1\binom{n}{k+1}=\binom{n}{k}\times\frac{n-k}{k+1}.
  • b) Écrivez une fonction `proba(n, p, k)` qui renvoie P(X=k)P(X=k) en utilisant cette relation, et donnez P(X=15)P(X=15) au millionième.
  • c) Écrivez un programme qui calcule P(X20)P(X\ge 20) et donnez sa valeur.
  • d) Pourquoi évite-t-on d'écrire directement n!k!(nk)!\frac{n!}{k!\,(n-k)!} lorsque nn vaut plusieurs centaines ?

Tape tes réponses, la page te dit juste ou faux 0/3

b)
c)
d)
Voir la correction

Réponses

  • a) Quotient des factorielles : nkk+1\frac{n-k}{k+1}
  • b) P(X=15)0,122347P(X=15)\approx 0{,}122347
  • c) P(X20)0,084803P(X\geq 20)\approx 0{,}084803
  • d) Les factorielles dépassent 1030810^{308}

a) On part de la définition : (nk+1)=n!(k+1)!(nk1)!\binom{n}{k+1}=\frac{n!}{(k+1)!\,(n-k-1)!} et (nk)=n!k!(nk)!\binom{n}{k}=\frac{n!}{k!\,(n-k)!}. Le quotient vaut donc (nk+1)(nk)=k!(nk)!(k+1)!(nk1)!\frac{\binom{n}{k+1}}{\binom{n}{k}}=\frac{k!\,(n-k)!}{(k+1)!\,(n-k-1)!}. Or (k+1)!=(k+1)×k!(k+1)!=(k+1)\times k! et (nk)!=(nk)×(nk1)!(n-k)!=(n-k)\times(n-k-1)!, donc tout se simplifie et il reste nkk+1\frac{n-k}{k+1}, 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 kk fois la relation de a) en partant de (n0)=1\binom{n}{0}=1. On obtient P(X=15)0,122347P(X=15)\approx 0{,}122347. La valeur k=15k=15 est aussi l'espérance, E(X)=np=50×0,3=15E(X)=np=50\times 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(X20)0,084803P(X\ge 20)\approx 0{,}084803. On peut aussi écrire P(X20)=1P(X19)P(X\ge 20)=1-P(X\le 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'à 5050 INCLUS, sans quoi il manque un terme.

d) Parce que les factorielles explosent : 200!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 pkp^{k} provoque un dépassement de capacité, la plage des flottants s'arrêtant vers 1030810^{308}. 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\sqrt{7}, on applique la méthode de Newton à la fonction f(x)=x27f(x)=x^2-7 : partant de x0=3x_0=3, on remplace à chaque étape xkx_k par l'abscisse du point où la TANGENTE à la courbe en xkx_k coupe l'axe des abscisses.

  • a) Montrez que la relation de récurrence s'écrit xk+1=12(xk+7xk)x_{k+1}=\frac{1}{2}\left(x_k+\frac{7}{x_k}\right), et écrivez le programme correspondant.
  • b) Calculez x1x_1, x2x_2 et x3x_3, puis comparez à 72,645751311\sqrt{7}\approx 2{,}645751311. Combien de décimales exactes gagne-t-on par étape ?
  • c) La fonction ff est convexe sur ]0;+[]0\,;+\infty[. 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][2\,;3], pour atteindre la précision de x3x_3 ?

Tape tes réponses, la page te dit juste ou faux 0/5

b)
c)
d)
Voir la correction

Réponses

  • a) xk+1=12(xk+7xk)x_{k+1}=\frac{1}{2}\left(x_{k}+\frac{7}{x_{k}}\right)
  • b) 83\frac{8}{3}, 2,6458332{,}645833, 2,6457513122{,}645751312 : décimales doublées
  • c) Suite décroissante minorée par 7\sqrt{7}
  • d) 3030 étapes de dichotomie

a) La tangente en xkx_k a pour équation y=f(xk)(xxk)+f(xk)y=f'(x_k)(x-x_k)+f(x_k), soit y=2xk(xxk)+xk27y=2x_k(x-x_k)+x_k^2-7. Elle coupe l'axe des abscisses lorsque y=0y=0, donc x=xkxk272xk=2xk2xk2+72xk=xk2+72xk=12(xk+7xk)x=x_k-\frac{x_k^2-7}{2x_k}=\frac{2x_k^2-x_k^2+7}{2x_k}=\frac{x_k^2+7}{2x_k}=\frac{1}{2}\left(x_k+\frac{7}{x_k}\right) ✓. 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 xkx_k et de 7xk\frac{7}{x_k}, deux nombres dont le produit vaut toujours 77 : si l'un est trop grand, l'autre est trop petit, et leur moyenne est meilleure que les deux.

b) x1=12(3+73)=12×163=832,666667x_1=\frac{1}{2}\left(3+\frac{7}{3}\right)=\frac{1}{2}\times\frac{16}{3}=\frac{8}{3}\approx 2{,}666667, puis x22,645833x_2\approx 2{,}645833, puis x32,645751312x_3\approx 2{,}645751312. Les erreurs valent respectivement 2,1×1022{,}1\times 10^{-2}, 8,2×1058{,}2\times 10^{-5} et 1,2×1091{,}2\times 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,30{,}3 par étape.

c) f(x)=2>0f''(x)=2>0, donc ff est convexe et sa courbe est au-DESSUS de chacune de ses tangentes. En particulier, la tangente en xkx_k coupe l'axe des abscisses AVANT que la courbe ne le fasse, du côté où l'on vient : pour xk>7x_k>\sqrt7, on obtient xk+1>7x_{k+1}>\sqrt7. La suite reste donc minorée par 7\sqrt7 à partir du rang 00, et l'on vérifie qu'elle est décroissante : xkxk+1=xk272xk>0x_k-x_{k+1}=\frac{x_k^2-7}{2x_k}>0 dès que xk>7x_k>\sqrt7. Décroissante et minorée, elle converge, et sa limite LL vérifie L=12(L+7L)L=\frac{1}{2}\left(L+\frac{7}{L}\right), donc L2=7L^2=7 et L=7L=\sqrt7. La convexité est ce qui rend la démonstration possible.

d) La dichotomie sur [2;3][2\,;3] donne après nn étapes une précision de 12n\frac{1}{2^{\,n}}. Pour atteindre 1,2×1091{,}2\times 10^{-9}, il faut 2n11,2×1098,3×1082^{\,n}\ge\frac{1}{1{,}2\times 10^{-9}}\approx 8{,}3\times 10^{8}, soit n=30n=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)
22.22.42.62.833.23.4-4-3-2-11234tangente en x0 = 3elle coupe l'axe en x1 = 8/3courbe au-dessus de sa tangente

Exercice 7 : Compléter un programme : la méthode des trapèzes

On reprend I=01ex2dxI=\int_{0}^{1}e^{-x^{2}}\,dx. La méthode des trapèzes remplace chaque rectangle par le trapèze dont les deux côtés verticaux valent ff aux deux extrémités du sous-intervalle.

Le programme suivant la met en oeuvre. Trois éléments sont incomplets.

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=10n=10, sachant que I0,74682413I\approx 0{,}74682413. Quelle est l'erreur ?
  • c) La valeur pour n=20n=20 vaut 0,746670840{,}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 ?

Tape tes réponses, la page te dit juste ou faux 0/5

a)
b)
c)
d)
Voir la correction

Réponses

  • a) `s = (f(0) + f(1))/2`, `s = s + f(k*h)`, `return s*h`
  • b) 0,746210800{,}74621080, erreur 6,13×104\approx 6{,}13\times 10^{-4}
  • c) Erreur divisée par 44 : ordre h2h^{2}
  • d) Moyenne des rectangles : 0,7462110{,}746211

a) Un trapèze de hauteur hh et de bases f(xk)f(x_k) et f(xk+1)f(x_{k+1}) a pour aire h×f(xk)+f(xk+1)2h\times\frac{f(x_k)+f(x_{k+1})}{2}. 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)f(0) et f(1)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,746210800{,}74621080. L'erreur vaut 0,746210800,746824136,13×104\left|0{,}74621080-0{,}74682413\right|\approx 6{,}13\times 10^{-4}. À comparer avec l'exercice 3 : les rectangles à gauche donnaient 0,7778170{,}777817, soit une erreur de 3,1×1023{,}1\times 10^{-2}, cinquante fois plus grande pour exactement le même nombre d'évaluations de ff.

c) Pour n=20n=20, l'erreur vaut 0,746670840,746824131,53×104\left|0{,}74667084-0{,}74682413\right|\approx 1{,}53\times 10^{-4}. Le rapport des deux erreurs vaut 6,13×1041,53×1044\frac{6{,}13\times 10^{-4}}{1{,}53\times 10^{-4}}\approx 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 à h2h^2, alors que celle des rectangles est proportionnelle à hh. Pour gagner une décimale, il suffit de multiplier nn par un peu plus de trois, contre dix pour les rectangles.

d) La somme des rectangles à gauche vaut h(f(x0)+f(x1)++f(xn1))h\left(f(x_0)+f(x_1)+\dots+f(x_{n-1})\right) et celle des rectangles à droite h(f(x1)++f(xn))h\left(f(x_1)+\dots+f(x_n)\right). Leur moyenne vaut h(f(x0)+f(xn)2+f(x1)++f(xn1))h\left(\frac{f(x_0)+f(x_n)}{2}+f(x_1)+\dots+f(x_{n-1})\right), ce qui est exactement la formule des trapèzes ✓. Pour n=10n=10 on retrouve bien 0,777817+0,7146052=0,746211\frac{0{,}777817+0{,}714605}{2}=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 ff, d'où l'ordre h2h^2.

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 ff 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 nn divise l'erreur par quatre. »
  • d) « Pour calculer P(X=k)P(X=k) d'une loi binomiale avec n=500n=500, on écrit directement le quotient de factorielles. »
  • e) « La méthode de Newton converge quel que soit le point de départ. »

Tape tes réponses, la page te dit juste ou faux 0/5

a)
b)
c)
d)
e)
Voir la correction

Réponses

  • a) Faux : la continuité est une hypothèse
  • b) Faux : Euler converge sans être exacte
  • c) Faux : rectangles en hh, trapèzes en h2h^{2}
  • 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 x1x0,5x\mapsto\frac{1}{x-0{,}5}, qui change de signe en 0,50{,}5 sans s'y annuler, la dichotomie sur [0;1][0\,;1] renverrait un encadrement de 0,50{,}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>0h>0 fixé, la méthode d'Euler commet une erreur non nulle : l'exercice 4 la calcule exactement, yn=32(12h)ny_n=3-2(1-2h)^{n} contre 32e23-2e^{-2}. Version correcte : « la méthode d'Euler CONVERGE vers la solution exacte quand le pas tend vers 00, 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 hh, donc doubler nn ne la divise que par DEUX ; celle des trapèzes est proportionnelle à h2h^2, donc doubler nn la divise par quatre. C'est exactement ce qu'on mesure à l'exercice 7. Version correcte : « rectangles, erreur en hh ; trapèzes, erreur en h2h^2 ». 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!500! est un entier de plus de mille chiffres ; Python le calcule exactement, mais le convertir en flottant pour le multiplier par pkp^{k} dépasse la capacité des nombres à virgule flottante, dont le maximum est de l'ordre de 1030810^{308}. Version correcte : « on calcule les coefficients binomiaux de proche en proche par (nk+1)=(nk)×nkk+1\binom{n}{k+1}=\binom{n}{k}\times\frac{n-k}{k+1}, 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)=0f'(x_k)=0, puisque l'on divise par la dérivée. Sur f(x)=x27f(x)=x^2-7 partant de x0=0x_0=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,0C=1{,}0 μ\muF se charge à travers une résistance R=2,0R=2{,}0 kΩ\Omega sous une tension E=5,0E=5{,}0 V. La tension uu à ses bornes vérifie τu+u=E\tau\,u'+u=E avec τ=RC\tau=RC, et u(0)=0u(0)=0.

On approche cette évolution par la méthode d'Euler : uk+1=uk+hEukτu_{k+1}=u_k+h\,\frac{E-u_k}{\tau}.

  • a) Calculez τ\tau en millisecondes, puis écrivez le programme donnant u(τ)u(\tau) avec un pas h=0,2h=0{,}2 ms.
  • b) Montrez que un=E(1(1hτ)n)u_n=E\left(1-\left(1-\frac{h}{\tau}\right)^{n}\right), et donnez la valeur obtenue au a).
  • c) Résolvez exactement l'équation différentielle, donnez u(τ)u(\tau) et comparez aux résultats d'Euler pour h=0,2h=0{,}2 ms puis h=0,02h=0{,}02 ms.
  • d) Au bout de combien de temps la tension atteint-elle 99%99\% de EE ? Dans quel sens la méthode d'Euler se trompe-t-elle ici, et pourquoi ?

Tape tes réponses, la page te dit juste ou faux 0/6

a)
b)
c)
d)
Voir la correction

Réponses

  • a) τ=2,0\tau=2{,}0 ms, 1010 tours
  • b) un=E(1qn)u_{n}=E(1-q^{n}) ; u103,2566u_{10}\approx 3{,}2566 V
  • c) u(τ)3,1606u(\tau)\approx 3{,}1606 V ; Euler h=0,02h=0{,}02 : 3,16983{,}1698 V
  • d) t9,2t\approx 9{,}2 ms ; Euler surestime

a) τ=RC=2,0×103×1,0×106=2,0×103\tau=RC=2{,}0\times 10^{3}\times 1{,}0\times 10^{-6}=2{,}0\times 10^{-3} s, soit 2,02{,}0 ms. Il faut donc 2,00,2=10\frac{2{,}0}{0{,}2}=10 tours pour aller de 00 à τ\tau. 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τ\frac{h}{\tau} intervient.

b) La relation se réécrit uk+1=uk(1hτ)+hEτu_{k+1}=u_k\left(1-\frac{h}{\tau}\right)+\frac{hE}{\tau}, suite arithmético-géométrique de raison q=1hτq=1-\frac{h}{\tau}. Son point fixe vérifie L=Lq+hEτL=Lq+\frac{hE}{\tau}, soit Lhτ=hEτL\frac{h}{\tau}=\frac{hE}{\tau} et L=EL=E, ce qui est physiquement attendu : le condensateur chargé atteint la tension du générateur. En posant zk=ukEz_k=u_k-E, on obtient zk+1=qzkz_{k+1}=qz_k avec z0=Ez_0=-E, donc zn=Eqnz_n=-Eq^{\,n} et un=E(1qn)u_n=E\left(1-q^{\,n}\right) ✓. Pour h=0,2h=0{,}2 ms : q=0,9q=0{,}9 et u10=5(10,910)=5×0,6513223,2566u_{10}=5\left(1-0{,}9^{10}\right)=5\times 0{,}651322\approx 3{,}2566 V.

c) L'équation u=Euτu'=\frac{E-u}{\tau} a pour solutions u(t)=E+Ket/τu(t)=E+Ke^{-t/\tau}, et la condition u(0)=0u(0)=0 donne K=EK=-E, d'où u(t)=E(1et/τ)u(t)=E\left(1-e^{-t/\tau}\right). Donc u(τ)=5(1e1)3,1606u(\tau)=5\left(1-e^{-1}\right)\approx 3{,}1606 V, ce qui est le résultat classique : à t=τt=\tau, le condensateur est chargé à 63%63\%. Euler avec h=0,2h=0{,}2 ms donnait 3,25663{,}2566 V, soit une erreur de 9,6×1029{,}6\times 10^{-2} V ; avec h=0,02h=0{,}02 ms, c'est-à-dire 100100 tours, on obtient 5(10,99100)3,16985\left(1-0{,}99^{100}\right)\approx 3{,}1698 V, soit une erreur de 9,2×1039{,}2\times 10^{-3} V. L'erreur a bien été divisée par dix comme le pas.

d) On résout E(1et/τ)=0,99EE\left(1-e^{-t/\tau}\right)=0{,}99E, soit et/τ=0,01e^{-t/\tau}=0{,}01, donc tτ=ln100\frac{t}{\tau}=\ln 100 et t=τln1002,0×4,6059,2t=\tau\ln 100\approx 2{,}0\times 4{,}605\approx 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 1x<ex1-x<e^{-x} pour x>0x>0, on a qn=(1hτ)n<e1q^{\,n}=\left(1-\frac{h}{\tau}\right)^{n}<e^{-1}, donc un>u(τ)u_n>u(\tau). 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 uu se rapproche de EE. 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)
123456789100.511.522.533.544.555.5E = 5,0 Vu(tau) = 3,16 V soit 63 % de Epoints : Euler, pas de 0,2 ms

Exercice 10 : Problème de synthèse : suivi cinétique d'une réaction

On suit la disparition d'un réactif AA 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 11, c'est-à-dire si dcdt=kc\frac{dc}{dt}=-k\,c, 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 kk à partir des valeurs extrêmes, puis le temps de demi-réaction t1/2t_{1/2}.
  • c) La quantité de AA consommée par litre entre 00 et 4040 min vaut 040kc(t)dt\int_{0}^{40}k\,c(t)\,dt. Calculez-la par la méthode des trapèzes sur les cinq points, et comparez à c(0)c(40)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 ?

Tape tes réponses, la page te dit juste ou faux 0/5

a)
b)
c)
d)
Voir la correction

Réponses

  • a) Écarts de lnc\ln c presque constants : ordre 11
  • b) k0,0492k\approx 0{,}0492 min1^{-1}, t1/214,1t_{1/2}\approx 14{,}1 min
  • c) Trapèzes : 0,0870\approx 0{,}0870 mol/L contre 0,0860{,}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{,}3026, 2,7969-2{,}7969, 3,2968-3{,}2968, 3,8167-3{,}8167, 4,2687-4{,}2687, et les écarts successifs 0,4943-0{,}4943, 0,5000-0{,}5000, 0,5199-0{,}5199, 0,4520-0{,}4520. Ces écarts sont pratiquement CONSTANTS, aux incertitudes de mesure près : lnc\ln c est donc une fonction affine du temps, ce qui caractérise l'ordre 11. En effet, c(t)=c0ektc(t)=c_0e^{-kt} donne lnc(t)=lnc0kt\ln c(t)=\ln c_0-kt, une droite de pente k-k. Un ordre 22 aurait donné 1c\frac{1}{c} affine, et c'est ce test de linéarisation, plutôt que l'allure de la courbe, qui tranche.

b) La pente vaut lnc(40)lnc(0)40=4,2687+2,302640=1,9661400,04915\frac{\ln c(40)-\ln c(0)}{40}=\frac{-4{,}2687+2{,}3026}{40}=\frac{-1{,}9661}{40}\approx -0{,}04915, donc k0,0492k\approx 0{,}0492 min1^{-1}. Le temps de demi-réaction vérifie c(t1/2)=c02c\left(t_{1/2}\right)=\frac{c_0}{2}, soit ekt1/2=12e^{-k t_{1/2}}=\frac{1}{2} et t1/2=ln2k0,69310,0491514,1t_{1/2}=\frac{\ln 2}{k}\approx\frac{0{,}6931}{0{,}04915}\approx 14{,}1 min. Ce résultat est cohérent avec le tableau : la concentration passe de 0,1000{,}100 à 0,0500{,}050 entre les relevés de 1010 et 2020 minutes. Pour un ordre 11, t1/2t_{1/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 1414 et 2828 minutes.

c) Les valeurs de la vitesse v=kcv=kc valent 0,0049150{,}004915, 0,0029980{,}002998, 0,0018190{,}001819, 0,0010810{,}001081 et 0,0006880{,}000688 mol/(L\cdotmin). La formule des trapèzes avec h=10h=10 min donne 10×(0,004915+0,0006882+0,002998+0,001819+0,001081)=10×0,0087000,087010\times\left(\frac{0{,}004915+0{,}000688}{2}+0{,}002998+0{,}001819+0{,}001081\right)=10\times 0{,}008700\approx 0{,}0870 mol/L. La valeur attendue est c(0)c(40)=0,1000,014=0,086c(0)-c(40)=0{,}100-0{,}014=0{,}086 mol/L. L'écart relatif vaut 0,08700,0860,0861,2%\frac{0{,}0870-0{,}086}{0{,}086}\approx 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 tkc0ektt\mapsto kc_0e^{-kt} est convexe, puisque sa dérivée seconde k3c0ektk^3c_0e^{-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 1010 minutes est d'ailleurs grossier face à un temps de demi-réaction de 1414 minutes : avec des relevés toutes les 55 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)
1020304050-5-4.5-4-3.5-3-2.5-2ln c est affine en t : ordre 1pente -0,04915 : k = 0,0492 /min

Partie C : les classiques (/50)

Exercice 11 : La série harmonique et son seuil

On pose Hn=1+12+13++1n=k=1n1kH_{n}=1+\frac{1}{2}+\frac{1}{3}+\dots+\frac{1}{n}=\sum_{k=1}^{n}\frac{1}{k} pour n1n\geq 1. On admet que la suite (Hn)(H_{n}) tend vers ++\infty.

def seuil(A):
    n = 0
    H = 0
    while H <= A:
        n = n + 1
        H = H + 1/n
    return n
  • a) Calculez H4H_{4} sous forme de fraction irréductible.
  • b) Écrivez une fonction `seuil(A)` qui renvoie le plus petit entier nn tel que Hn>AH_{n}>A.
  • c) Que renvoient `seuil(3)` et `seuil(5)` ?
  • d) On admet que ln(n+1)Hn1+lnn\ln(n+1)\leq H_{n}\leq 1+\ln n. Déduisez-en un encadrement du plus petit nn tel que Hn>10H_{n}>10, et expliquez pourquoi le programme est alors peu adapté.

Tape tes réponses, la page te dit juste ou faux 0/6

a)
b)
c)
d)
Voir la correction

Réponses

  • a) H4=2512H_{4}=\frac{25}{12}
  • b) Boucle `while H <= A`, nn incrémenté avant d'ajouter 1n\frac{1}{n}
  • c) 1111 et 8383
  • d) Entre 81048\,104 et 2202622\,026 (en fait 1236712\,367)

a) H4=1+12+13+14=12+6+4+312=25122,083H_{4}=1+\frac{1}{2}+\frac{1}{3}+\frac{1}{4}=\frac{12+6+4+3}{12}=\frac{25}{12}\approx 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 nn AVANT d'ajouter 1n\frac{1}{n}, sinon on diviserait par zéro au premier tour.

c) `seuil(3)` renvoie 1111, car H102,9293H_{10}\approx 2{,}929\leq 3 et H113,020>3H_{11}\approx 3{,}020>3. `seuil(5)` renvoie 8383, avec H835,002H_{83}\approx 5{,}002. Passer de 33 à 55 multiplie déjà le nombre de termes par plus de sept.

d) Si Hn>10H_{n}>10, alors 1+lnnHn>101+\ln n\geq H_{n}>10, donc lnn>9\ln n>9 et n>e98103n>e^{9}\approx 8\,103. Inversement, dès que ln(n+1)>10\ln(n+1)>10, c'est-à-dire n+1>e1022026n+1>e^{10}\approx 22\,026, on a Hn>10H_{n}>10. Le seuil est donc compris entre 81048\,104 et 2202622\,026 (il vaut en fait 1236712\,367). Le programme s'en sort encore, mais pour Hn>50H_{n}>50 il faudrait de l'ordre de e505×1021e^{50}\approx 5\times 10^{21} 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)(H_{n}). 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=1u_{0}=1, u1=1u_{1}=1 et, pour tout entier naturel nn, un+2=un+1+unu_{n+2}=u_{n+1}+u_{n}.

On complète le programme ci-dessous, qui construit la liste des termes de u0u_{0} à uNu_{N}.

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 u10u_{10} et u20u_{20} ?
  • c) Calculez u20u19\frac{u_{20}}{u_{19}} au millionième et comparez au nombre d'or φ=1+52\varphi=\frac{1+\sqrt{5}}{2}.
  • d) Que renvoie `sum(fibo(9))`, et vérifiez la relation u0+u1++u9=u111u_{0}+u_{1}+\dots+u_{9}=u_{11}-1.

Tape tes réponses, la page te dit juste ou faux 0/5

a)
b)
c)
d)
Voir la correction

Réponses

  • a) `L.append(L[-1] + L[-2])`
  • b) u10=89u_{10}=89, u20=10946u_{20}=10\,946
  • c) 1,618034=φ\approx 1{,}618034=\varphi
  • d) 143=u111143=u_{11}-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,891, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 : u10=89u_{10}=89. En poursuivant, u19=6765u_{19}=6\,765 et u20=10946u_{20}=10\,946. Attention au décalage d'indice : la liste `fibo(10)` contient ONZE termes, de u0u_{0} à u10u_{10}.

c) u20u19=1094667651,618034\frac{u_{20}}{u_{19}}=\frac{10\,946}{6\,765}\approx 1{,}618034, et φ1,618034\varphi\approx 1{,}618034 : les six premières décimales coïncident. On peut montrer que si le rapport un+1un\frac{u_{n+1}}{u_{n}} converge vers >0\ell>0, alors =1+1\ell=1+\frac{1}{\ell}, soit 21=0\ell^{2}-\ell-1=0, dont la racine positive est exactement φ\varphi.

d) `fibo(9)` est la liste de u0u_{0} à u9u_{9}, dont la somme vaut 1+1+2+3+5+8+13+21+34+55=1431+1+2+3+5+8+13+21+34+55=143. Et u11=144u_{11}=144, donc u111=143u_{11}-1=143 ✓. La relation se démontre par récurrence : si k=0nuk=un+21\sum_{k=0}^{n}u_{k}=u_{n+2}-1, alors k=0n+1uk=un+21+un+1=un+31\sum_{k=0}^{n+1}u_{k}=u_{n+2}-1+u_{n+1}=u_{n+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)M(x\,;y) dans le carré [0;1]×[0;1][0\,;1]\times[0\,;1], xx et yy étant tirés indépendamment et uniformément. On note pp la probabilité que MM soit dans le quart de disque de centre OO et de rayon 11, c'est-à-dire que x2+y21x^{2}+y^{2}\leq 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=π4p=\frac{\pi}{4} et donnez-en une valeur approchée au millième.
  • b) Complétez le programme pour qu'il renvoie une estimation de π\pi à partir de nn points.
  • c) Un essai avec n=10000n=10\,000 donne 78367\,836 points dans le quart de disque. Quelle estimation de π\pi obtient-on ?
  • d) On note FnF_{n} la fréquence des points dans le quart de disque. D'après l'inégalité de concentration, P(Fnpδ)p(1p)nδ2P(|F_{n}-p|\geq\delta)\leq\frac{p(1-p)}{n\delta^{2}}. Quelle valeur de nn garantit P(Fnp0,01)0,05P(|F_{n}-p|\geq 0{,}01)\leq 0{,}05 ?

Tape tes réponses, la page te dit juste ou faux 0/4

a)
b)
c)
d)
Voir la correction

Réponses

  • a) p=π40,785p=\frac{\pi}{4}\approx 0{,}785
  • b) Compter les points avec x2+y21x^{2}+y^{2}\leq 1, renvoyer `4*c/n`
  • c) π3,1344\pi\approx 3{,}1344
  • d) n33710n\geq 33\,710

a) Le tirage étant uniforme dans le carré d'aire 11, la probabilité d'une zone est son aire. Le quart de disque de rayon 11 a pour aire π×124=π4\frac{\pi\times 1^{2}}{4}=\frac{\pi}{4}. Donc p=π40,785p=\frac{\pi}{4}\approx 0{,}785.

b) On compte les points qui tombent dans le quart de disque, puis on multiplie la fréquence par 44 : 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[[0\,;1[.

c) La fréquence vaut 783610000=0,7836\frac{7\,836}{10\,000}=0{,}7836, d'où l'estimation π4×0,7836=3,1344\pi\approx 4\times 0{,}7836=3{,}1344. L'erreur est d'environ 0,0070{,}007 : on n'a que deux décimales exactes avec dix mille points.

d) p(1p)=π4(1π4)0,1685p(1-p)=\frac{\pi}{4}\left(1-\frac{\pi}{4}\right)\approx 0{,}1685. On veut 0,1685n×0,0120,05\frac{0{,}1685}{n\times 0{,}01^{2}}\leq 0{,}05, soit n0,16850,05×0,000133710n\geq\frac{0{,}1685}{0{,}05\times 0{,}0001}\approx 33\,710. Il faut au moins 3371033\,710 points pour avoir la fréquence à 0,010{,}01 près avec un risque d'au plus 5 %5\ \%, c'est-à-dire π\pi à 0,040{,}04 près seulement. En pratique on majore souvent p(1p)p(1-p) par 14\frac{1}{4}, ce qui donne 5000050\,000 points sans connaître pp.

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 1n\frac{1}{\sqrt{n}}, 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 α\alpha de [0;1][0\,;1] tel que cosα=α\cos\alpha=\alpha. On pose g(x)=cosxxg(x)=\cos x-x.

  • a) Montrez que gg est strictement décroissante sur [0;1][0\,;1] et que l'équation cosx=x\cos x=x y a une unique solution α\alpha.
  • b) On considère la suite u0=1u_{0}=1, un+1=cos(un)u_{n+1}=\cos(u_{n}). Calculez u1u_{1}, u2u_{2} et u3u_{3} au dix-millième.
  • c) On admet que la suite converge vers α\alpha et qu'il faut 3232 itérations pour que unα106|u_{n}-\alpha|\leq 10^{-6}. Donnez α\alpha au millionième.
  • d) La méthode de Newton appliquée à gg s'écrit xk+1=xkcosxkxksinxk1x_{k+1}=x_{k}-\frac{\cos x_{k}-x_{k}}{-\sin x_{k}-1}. Partant de x0=1x_{0}=1, calculez x1x_{1} et x2x_{2} au millionième.
  • e) Combien d'itérations de Newton suffisent pour atteindre la précision de c), sachant que x30,739085133x_{3}\approx 0{,}739085133 ?

Tape tes réponses, la page te dit juste ou faux 0/8

a)
b)
c)
d)
e)
Voir la correction

Réponses

  • a) g(x)=sinx1<0g'(x)=-\sin x-1<0 ; g(0)>0>g(1)g(0)>0>g(1)
  • b) 0,54030{,}5403 ; 0,85760{,}8576 ; 0,65430{,}6543
  • c) α0,739085\alpha\approx 0{,}739085
  • d) x10,750364x_{1}\approx 0{,}750364, x20,739113x_{2}\approx 0{,}739113
  • e) 33 itérations

a) g(x)=sinx1g'(x)=-\sin x-1. Sur [0;1][0\,;1], sinx0\sin x\geq 0, donc g(x)1<0g'(x)\leq-1<0 : gg est strictement décroissante. gg est continue, g(0)=1>0g(0)=1>0 et g(1)=cos110,46<0g(1)=\cos 1-1\approx-0{,}46<0 : par le corollaire du théorème des valeurs intermédiaires, gg s'annule une unique fois sur [0;1][0\,;1].

b) En radians : u1=cos10,5403u_{1}=\cos 1\approx 0{,}5403 ; u2=cos(0,5403)0,8576u_{2}=\cos(0{,}5403)\approx 0{,}8576 ; u3=cos(0,8576)0,6543u_{3}=\cos(0{,}8576)\approx 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][0\,;1]. Oublier de mettre la calculatrice en radians donne cos10,9998\cos 1\approx 0{,}9998 et une suite qui ne converge pas vers la bonne valeur.

c) α0,739085\alpha\approx 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|\sin\alpha|\approx 0{,}67, ce qui fait gagner moins de 0,20{,}2 décimale par tour.

d) x1=1cos11sin11=10,4596981,84147110,249636=0,750364x_{1}=1-\frac{\cos 1-1}{-\sin 1-1}=1-\frac{-0{,}459698}{-1{,}841471}\approx 1-0{,}249636=0{,}750364. Puis x20,739113x_{2}\approx 0{,}739113. L'erreur est déjà inférieure à 3×1053\times 10^{-5} au deuxième pas.

e) x3α|x_{3}-\alpha| est de l'ordre de 101010^{-10} : TROIS itérations suffisent, contre 3232 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\cos x=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 SS la somme des deux faces. On simule nn 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)P(S=7), puis E(S)E(S) en utilisant S=D1+D2S=D_{1}+D_{2}.
  • b) Sachant que V(D1)=3512V(D_{1})=\frac{35}{12}, calculez V(S)V(S) en justifiant.
  • c) Complétez le programme pour qu'il renvoie la fréquence des sommes égales à 77 sur nn lancers.
  • d) Pour n=1000n=1\,000, majorez P(Fn160,05)P\left(\left|F_{n}-\frac{1}{6}\right|\geq 0{,}05\right) à l'aide de l'inégalité de concentration.
  • e) Une simulation de 10001\,000 lancers donne 9191 sommes égales à 77. Ce résultat est-il surprenant ? Quelle erreur de programme pourrait l'expliquer ?

Tape tes réponses, la page te dit juste ou faux 0/6

a)
b)
c)
d)
e)
Voir la correction

Réponses

  • a) P(S=7)=16P(S=7)=\frac{1}{6}, E(S)=7E(S)=7
  • b) V(S)=356V(S)=\frac{35}{6}
  • c) `s = randint(1, 6) + randint(1, 6)`, compter les 77, `return c/n`
  • d) 0,0556\leq 0{,}0556
  • e) Écart 0,0760,050{,}076\geq 0{,}05 : très suspect, fréquence proche de 111\frac{1}{11}

a) Sur les 3636 couples équiprobables, 66 donnent 77 : (1,6)(1,6), (2,5)(2,5), (3,4)(3,4), (4,3)(4,3), (5,2)(5,2), (6,1)(6,1). P(S=7)=636=16P(S=7)=\frac{6}{36}=\frac{1}{6}. Par linéarité de l'espérance, E(S)=E(D1)+E(D2)=3,5+3,5=7E(S)=E(D_{1})+E(D_{2})=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)=3512+3512=3565,833V(S)=\frac{35}{12}+\frac{35}{12}=\frac{35}{6}\approx 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 22 et 1212 avec `randint(2, 12)` serait faux : les onze sommes ne sont pas équiprobables.

d) p(1p)nδ2=16×561000×0,052=0,13892,50,0556\frac{p(1-p)}{n\delta^{2}}=\frac{\frac{1}{6}\times\frac{5}{6}}{1\,000\times 0{,}05^{2}}=\frac{0{,}1389}{2{,}5}\approx 0{,}0556. La probabilité que la fréquence s'écarte de 16\frac{1}{6} d'au moins 0,050{,}05 est au plus d'environ 5,6 %5{,}6\ \%.

e) La fréquence observée vaut 0,0910{,}091, et 0,091160,0760,05\left|0{,}091-\frac{1}{6}\right|\approx 0{,}076\geq 0{,}05. D'après d), un écart d'au moins 0,050{,}05 a une probabilité d'au plus 5,6 %5{,}6\ \% si le programme est juste : le résultat est très suspect. Or 0,0910{,}091 est presque exactement 1110,0909\frac{1}{11}\approx 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
Chapitre précédent La convexité

Voir aussi

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.

Site par Studio Squalli