Spécialité maths, Première • Exercices corrigés à Montréal

Exercices corrigés : Python en spécialité maths et en sciences (Première)

Voici une série d'exercices corrigés de Python appliqué à la spécialité mathématiques, au niveau de la classe de Première du programme français, telle qu'elle est suivie au Lycée Marie de France et au Collège Stanislas à Montréal.

En Première, l'algorithmique n'est plus un chapitre à part : elle traverse les suites, la dérivation, le second degré et les probabilités. Chaque programme de cette série calcule un objet du cours, et chaque résultat affiché doit être retrouvé par un calcul exact. C'est ce va-et-vient qui est évalué au contrôle, jamais la syntaxe pour elle-même. Vous y programmez une suite récurrente et son point fixe (exercice 1), un algorithme de seuil avec une boucle while, prouvé ensuite par la forme explicite (exercice 2), la somme de versements annuels et sa formule fermée (exercice 3), le nombre dérivé approché par le taux d'accroissement (exercice 4), le nombre de racines par le discriminant (exercice 5), l'espérance et l'écart-type d'une variable aléatoire (exercice 6) et la résolution approchée d'une équation par balayage (exercice 7).

Les problèmes mettent ces outils en situation : la décroissance radioactive de l'iode 131 par la méthode d'Euler (exercice 9), la trajectoire d'un ballon qui franchit ou non un mur (exercice 10), la méthode d'Archimède pour approcher π\pi par des polygones (exercice 12), la géométrie repérée en Python (exercice 13), la suite de Syracuse et son temps de vol (exercice 14) et la fluctuation des moyennes d'échantillons (exercice 15). Les corrigés traitent les pièges propres à la machine : le return placé dans la boucle (exercice 1), le test d'égalité == sur des décimaux (exercices 6 et 13), le pas hh trop petit qui détruit le nombre dérivé (exercice 4) et la formule de doublement qui finit par afficher 00 (exercice 12) ; l'exercice 8 fait corriger cinq affirmations fausses.

La partie D suit le programme de Première en vigueur depuis la rentrée 2026. Elle travaille la seule notion nouvelle de l'algorithmique de Première, la liste, puis les exemples d'algorithme que le programme cite chapitre par chapitre : factorielle et Fibonacci pour les suites, sécantes et méthode de Newton pour la dérivation, intérêts composés pour le nombre e, Monte-Carlo pour les probabilités et fréquence des lettres pour les variables aléatoires. Son fil : une liste est un ensemble qu'on a rangé, et ses indices partent de 0.

Série autocorrigée Tape 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.

Ce chapitre fait partie de Spécialité mathématiques en Première
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 (4 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. 1 Algorithmique et Scratch Cinquième
  2. 2 Algorithmique et Scratch Quatrième
  3. 3 Algorithmique et Scratch Troisième
  4. 4 Algorithmique et Python Seconde

Rappel de cours

  • • Une suite définie par récurrence se calcule terme après terme : on initialise, puis on répète la mise à jour dans une boucle.
  • • Si un+1=aun+bu_{n+1}=a u_n + b avec a≠1a\ne 1, le point fixe LL vérifie L=aL+bL=aL+b, et la suite vn=un−Lv_n=u_n-L est géométrique de raison aa.
  • • Un seuil se cherche avec une boucle while : on répète tant que la condition d'arrêt n'est pas atteinte, en comptant les tours.
  • • Somme des termes d'une suite géométrique de raison q≠1q\ne 1 : u0×1−qn+11−qu_0\times\frac{1-q^{n+1}}{1-q}.
  • • Le nombre dérivé est la limite du taux d'accroissement f(a+h)−f(a)h\frac{f(a+h)-f(a)}{h} quand hh tend vers 00, et non sa valeur en h=0h=0.
  • • Discriminant Δ=b2−4ac\Delta=b^2-4ac : deux racines si Δ>0\Delta>0, une racine double si Δ=0\Delta=0, aucune racine réelle si Δ<0\Delta<0.
  • • Espérance E(X)=∑xipiE(X)=\sum x_i p_i, variance V(X)=E(X2)−E(X)2V(X)=E(X^2)-E(X)^2 et écart-type σ=V(X)\sigma=\sqrt{V(X)}.
  • • Les décimaux sont représentés de façon approchée en machine : une condition d'arrêt s'écrit avec une inégalité, jamais avec ==.
  • • Une liste se génère en extension, L = [1, 2, 3], par ajouts successifs avec L.append(x), ou en compréhension avec une condition, [x for x in range(n) if ...]. Ses indices vont de 00 à len(L) - 1.
  • • L.remove(v) retire la première occurrence de la valeur v ; L.pop(i) et del L[i] retirent l'élément d'indice i. On ne supprime jamais dans une liste pendant qu'on la parcourt.
  • • Méthode de Newton : xk+1=xk−f(xk)f′(xk)x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)}, abscisse du point où la tangente en xkx_k coupe l'axe des abscisses.

Partie A : les bases (/50)

Exercice 1 : Suite récurrente et point fixe

La suite (un)(u_n) est définie par u0=2u_0=2 et un+1=0,8 un+3u_{n+1}=0{,}8\,u_n+3 pour tout entier nn. On veut la calculer en Python.

def terme(n):
    u = 2
    for k in range(n):
        u = 0.8*u + 3
    return u
  • a) Calculez à la main u1u_1, u2u_2 et u3u_3, puis vérifiez que terme(3) renvoie la même valeur.
  • b) Un élève place l'instruction return u À L'INTÉRIEUR de la boucle. Que renvoie alors terme(3) ?
  • c) Que renvoie terme(0) ? Pourquoi ce cas est-il correct sans aucune ligne supplémentaire ?
  • d) Le programme affiche des valeurs qui se rapprochent d'un nombre. Déterminez-le par le calcul.

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

a)
b)
c)
d)
Voir la correction

Réponses

  • a) u1=4,6u_1=4{,}6, u2=6,68u_2=6{,}68, u3=8,344u_3=8{,}344
  • b) 4,64{,}6 : return interrompt la boucle
  • c) 22 : la boucle ne tourne pas
  • d) 1515
a)

On applique la relation trois fois : u1=0,8×2+3=4,6u_1=0{,}8\times 2+3=4{,}6, puis u2=0,8×4,6+3=3,68+3=6,68u_2=0{,}8\times 4{,}6+3=3{,}68+3=6{,}68, puis u3=0,8×6,68+3=5,344+3=8,344u_3=0{,}8\times 6{,}68+3=5{,}344+3=8{,}344. La boucle for k in range(3) effectue exactement trois mises à jour, donc terme(3) renvoie 8,3448{,}344. La variable de boucle k ne sert à rien d'autre qu'à compter : c'est normal, la relation de récurrence ne dépend pas de nn.

b)

Elle renvoie 4,64{,}6, c'est-à-dire u1u_1. L'instruction return ne se contente pas de renvoyer une valeur, elle INTERROMPT immédiatement la fonction : dès la fin du premier tour, tout s'arrête. C'est l'erreur la plus fréquente sur ce type de programme, et elle est silencieuse, puisque 4,64{,}6 est une valeur parfaitement plausible. Le return d'une fonction de calcul itératif se place toujours APRÈS la boucle, au même niveau d'indentation que le for.

c)

Il renvoie 22, c'est-à-dire u0u_0. La boucle range(0) est vide, donc aucune mise à jour n'a lieu et la fonction renvoie la valeur d'initialisation. Ce comportement est exactement celui que l'on veut, et il illustre un principe utile : une boucle qui tourne zéro fois n'est pas une erreur, c'est le cas de base traité gratuitement.

d)

Si la suite converge vers un réel LL, alors en passant à la limite dans la relation on obtient L=0,8L+3L=0{,}8L+3, donc 0,2L=30{,}2L=3 et L=15L=15. On le démontre proprement en posant vn=un−15v_n=u_n-15 : alors vn+1=un+1−15=0,8un+3−15=0,8(un−15)=0,8vnv_{n+1}=u_{n+1}-15=0{,}8u_n+3-15=0{,}8(u_n-15)=0{,}8v_n. La suite (vn)(v_n) est donc GÉOMÉTRIQUE de raison 0,80{,}8 et de premier terme v0=2−15=−13v_0=2-15=-13, d'où un=15−13×0,8 nu_n=15-13\times 0{,}8^{\,n}. Comme 0<0,8<10<0{,}8<1, le terme 0,8 n0{,}8^{\,n} tend vers 00 et unu_n tend vers 1515 en croissant, sans jamais l'atteindre.

Le fil de la série commence ici : la boucle produit des NOMBRES, le calcul produit une FORMULE. On vérifie la formule sur les nombres, ici u3=15−13×0,512=15−6,656=8,344u_3=15-13\times 0{,}512=15-6{,}656=8{,}344 ✓, et c'est ensuite la formule qui permet de répondre à toutes les questions de limite et de seuil.

def terme(n):
    u = 2
    for k in range(n):
        u = 0.8*u + 3
    return u

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 : Recherche de seuil et preuve associée

On garde la suite u0=2u_0=2 et un+1=0,8 un+3u_{n+1}=0{,}8\,u_n+3, dont on admet la forme explicite un=15−13×0,8 nu_n=15-13\times 0{,}8^{\,n}. On cherche le premier rang à partir duquel unu_n dépasse 14,914{,}9.

  • a) Écrivez un programme utilisant une boucle while qui affiche ce rang.
  • b) Donnez la valeur trouvée, en justifiant par les deux termes qui encadrent le seuil.
  • c) Retrouvez ce rang par le calcul, à l'aide de la forme explicite.
  • d) Pourquoi la boucle se termine-t-elle ? Que se passerait-il si le seuil valait 1515 ?

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

b)
d)
Voir la correction

Réponses

  • a) Boucle while u <= 14.9, avec mise à jour et compteur
  • b) 2222 (u21≈14,880u_{21}\approx 14{,}880, u22≈14,904u_{22}\approx 14{,}904)
  • c) 0,8 n<11300{,}8^{\,n}<\frac{1}{130} : n=22n=22
  • d) unu_n tend vers 1515 ; avec le seuil 1515, boucle infinie
a)

u = 2 puis n = 0 puis while u <= 14.9: puis u = 0.8*u + 3 puis n = n + 1 puis print(n). Les deux instructions du corps sont indissociables : la mise à jour du terme et le comptage du rang doivent avancer ENSEMBLE, sans quoi le rang affiché ne correspond pas au terme calculé.

b)

Le programme affiche 2222. En effet u21=15−13×0,821≈15−13×0,009223≈14,8801u_{21}=15-13\times 0{,}8^{21}\approx 15-13\times 0{,}009223\approx 14{,}8801, encore sous le seuil, tandis que u22=15−13×0,822≈15−13×0,007379≈14,9041u_{22}=15-13\times 0{,}8^{22}\approx 15-13\times 0{,}007379\approx 14{,}9041, qui le dépasse. Donner ces deux valeurs est indispensable : un rang de seuil ne se justifie jamais par le seul affichage du programme.

c)

On résout 15−13×0,8 n>14,915-13\times 0{,}8^{\,n}>14{,}9, soit 13×0,8 n<0,113\times 0{,}8^{\,n}<0{,}1, soit 0,8 n<1130≈0,007690{,}8^{\,n}<\frac{1}{130}\approx 0{,}00769. La suite (0,8 n)\left(0{,}8^{\,n}\right) est géométrique de raison comprise entre 00 et 11, donc strictement DÉCROISSANTE : dès qu'un rang convient, tous les suivants conviennent. La calculatrice donne 0,821≈0,009220{,}8^{21}\approx 0{,}00922, encore trop grand, et 0,822≈0,007380{,}8^{22}\approx 0{,}00738, qui convient. Le premier entier convenable est donc n=22n=22 ✓. C'est la décroissance qui fait de ce rang le SEUIL : sans elle, un rang convenable pourrait être suivi d'un rang qui ne convient plus.

d)

Elle se termine parce que 0,8 n0{,}8^{\,n} tend vers 00, donc unu_n tend vers 1515 : la suite finit par franchir n'importe quel seuil strictement inférieur à 1515. Avec un seuil égal à 1515, la boucle ne s'arrêterait JAMAIS, car un=15−13×0,8 nu_n=15-13\times 0{,}8^{\,n} reste strictement inférieur à 1515 pour tout nn. Une suite convergente ne dépasse pas sa limite : c'est le piège classique de la boucle while en analyse, et il ne se voit pas à la lecture du programme, seulement en connaissant la limite.

Le fil : le programme donne le rang, la forme explicite et la décroissance le démontrent, et les deux doivent coïncider. Quand ils diffèrent d'une unité, l'erreur est presque toujours un < écrit à la place d'un <= dans la condition d'arrêt.

u = 2
n = 0
while u <= 14.9:
    u = 0.8*u + 3
    n = n + 1
print(n)

Exercice 3 : Somme de termes et formule fermée

Une personne place 200200 dollars au début de chaque année sur un compte rémunéré à 5%5\% par an. Au bout de nn années, le capital vaut la somme Sn=200×1,05+200×1,052+⋯+200×1,05 nS_n=200\times 1{,}05+200\times 1{,}05^2+\dots+200\times 1{,}05^{\,n}.

def capital(n):
    s = 0
    for k in range(1, n+1):
        s = s + 200*1.05**k
    return s
  • a) Que renvoie capital(10) ? Donnez la valeur au centime.
  • b) Établissez la formule fermée de SnS_n et vérifiez-la sur n=10n=10.
  • c) Un élève initialise s = 200 au lieu de s = 0. De combien son résultat est-il faux ?
  • d) Écrivez un programme qui donne le nombre d'années nécessaires pour dépasser 50005000 dollars, et retrouvez-le par le calcul.

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

a)
b)
c)
d)
Voir la correction

Réponses

  • a) ≈2 641,36\approx 2\,641{,}36 dollars
  • b) Sn=4200(1,05 n−1)S_n=4200(1{,}05^{\,n}-1)
  • c) Trop grand de 200200 dollars
  • d) 1717 ans
a)

La boucle ajoute dix termes, de k=1k=1 à k=10k=10, puisque range(1, 11) s'arrête à 1010 inclus. La fonction renvoie environ 2641,362641{,}36 dollars. La ligne s = s + 200*1.05**k est le motif de l'ACCUMULATEUR : une variable qui part de zéro et à laquelle on ajoute un terme par tour, la division ou la conclusion venant après la boucle.

b)

C'est la somme des termes d'une suite géométrique de premier terme 210210 et de raison 1,051{,}05, comptant nn termes : Sn=210×1,05 n−11,05−1=4200(1,05 n−1)S_n=210\times\frac{1{,}05^{\,n}-1}{1{,}05-1}=4200\left(1{,}05^{\,n}-1\right). Pour n=10n=10 : 1,0510≈1,628891{,}05^{10}\approx 1{,}62889, donc S10≈4200×0,62889≈2641,36S_{10}\approx 4200\times 0{,}62889\approx 2641{,}36 dollars, ce qui coïncide avec l'affichage ✓. Comparaison instructive : si les versements avaient lieu en FIN d'année, la somme partirait de k=0k=0 et vaudrait 200×1,0510−10,05≈2515,58200\times\frac{1{,}05^{10}-1}{0{,}05}\approx 2515{,}58 dollars, soit 125,78125{,}78 dollars de moins. Un décalage d'un seul indice se paie donc en argent réel, et c'est exactement ce que la comparaison programme contre formule permet de détecter.

c)

Il ajoute 200200 dollars qui ne correspondent à aucun versement rémunéré : son résultat est trop grand de exactement 200200 dollars, soit 2841,362841{,}36 au lieu de 2641,362641{,}36. L'initialisation d'un accumulateur de somme est toujours 00, comme celle d'un accumulateur de produit est toujours 11 : c'est l'élément neutre de l'opération que l'on répète.

d)

s = 0 puis n = 0 puis while s <= 5000: puis n = n + 1 puis s = s + 200*1.05**n puis print(n). Le programme affiche 1717. Par le calcul : 4200(1,05 n−1)>50004200(1{,}05^{\,n}-1)>5000 équivaut à 1,05 n>1+50004200≈2,19051{,}05^{\,n}>1+\frac{5000}{4200}\approx 2{,}1905, et la suite (1,05 n)\left(1{,}05^{\,n}\right) est croissante : 1,0516≈2,18291{,}05^{16}\approx 2{,}1829 ne suffit pas, 1,0517≈2,29201{,}05^{17}\approx 2{,}2920 convient, d'où n=17n=17 ✓. On vérifie : S16≈4968,07S_{16}\approx 4968{,}07 dollars et S17≈5426,48S_{17}\approx 5426{,}48 dollars.

Le fil : dès qu'une somme apparaît, deux écritures coexistent, la boucle et la formule. La formule est indispensable pour les seuils, la boucle sert de contrôle, et le seul vrai danger est l'indice de départ.

s = 0
n = 0
while s <= 5000:
    n = n + 1
    s = s + 200*1.05**n
print(n)

Exercice 4 : Nombre dérivé approché et limites de la machine

Soit ff définie sur R\mathbb{R} par f(x)=x3−2xf(x)=x^3-2x. On veut estimer le nombre dérivé de ff en a=1a=1 à l'aide du taux d'accroissement T(h)=f(1+h)−f(1)hT(h)=\frac{f(1+h)-f(1)}{h}.

def f(x):
    return x**3 - 2*x

for k in range(1, 7):
    h = 10**(-k)
    print(h, (f(1+h) - f(1))/h)
  • a) Donnez les valeurs affichées pour k=1k=1, k=2k=2 et k=3k=3, au millième.
  • b) Développez T(h)T(h) en fonction de hh et déduisez-en la limite quand hh tend vers 00.
  • c) Retrouvez le résultat en dérivant ff, puis donnez l'équation de la tangente en 11.
  • d) Un élève prend h=10−17h=10^{-17} et obtient 00. Expliquez pourquoi, et dites quel ordre de grandeur de hh il faut choisir.

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

a)
b)
c)
d)
Voir la correction

Réponses

  • a) 1,3101{,}310 ; 1,0301{,}030 ; 1,0031{,}003
  • b) T(h)=1+3h+h2T(h)=1+3h+h^{2}, limite 11
  • c) f′(1)=1f'(1)=1 ; tangente y=x−2y=x-2
  • d) 1+10−171+10^{-17} vaut 11 en machine ; choisir hh vers 10−610^{-6} à 10−810^{-8}
a)

On a f(1)=1−2=−1f(1)=1-2=-1. Pour h=0,1h=0{,}1 : f(1,1)=1,331−2,2=−0,869f(1{,}1)=1{,}331-2{,}2=-0{,}869, donc T=−0,869+10,1=1,310T=\frac{-0{,}869+1}{0{,}1}=1{,}310. Pour h=0,01h=0{,}01 : f(1,01)=1,030301−2,02=−0,989699f(1{,}01)=1{,}030301-2{,}02=-0{,}989699, donc T=1,030T=1{,}030. Pour h=0,001h=0{,}001 : T=1,003T=1{,}003. Les valeurs se rapprochent visiblement de 11.

b)

On développe : f(1+h)=(1+h)3−2(1+h)=1+3h+3h2+h3−2−2h=−1+h+3h2+h3f(1+h)=(1+h)^3-2(1+h)=1+3h+3h^2+h^3-2-2h=-1+h+3h^2+h^3. En retranchant f(1)=−1f(1)=-1 il reste h+3h2+h3h+3h^2+h^3, et en divisant par hh, qui est non nul, on obtient T(h)=1+3h+h2T(h)=1+3h+h^2. La limite quand hh tend vers 00 vaut donc 11. Cette écriture explique les chiffres observés : pour h=0,1h=0{,}1 on lit 1+0,3+0,01=1,311+0{,}3+0{,}01=1{,}31 ✓, et l'erreur est de l'ordre de 3h3h, ce qui se voit à l'oeil sur la colonne des résultats.

c)

f′(x)=3x2−2f'(x)=3x^2-2, donc f′(1)=3−2=1f'(1)=3-2=1, ce qui confirme la limite. La tangente en 11 a pour équation y=f′(1)(x−1)+f(1)y=f'(1)(x-1)+f(1), soit y=(x−1)−1y=(x-1)-1, c'est-à-dire y=x−2y=x-2. Le taux d'accroissement est le coefficient directeur de la SÉCANTE passant par les points d'abscisses 11 et 1+h1+h ; quand hh diminue, cette sécante bascule vers la tangente, et le nombre dérivé est la position limite de sa pente.

d)

Parce qu'en machine 1+10−171+10^{-17} est arrondi à 11 exactement : les nombres flottants ne retiennent qu'une quinzaine de chiffres significatifs, et un 11 suivi de dix-sept zéros puis d'un 11 ne tient pas. Le numérateur f(1+h)−f(1)f(1+h)-f(1) devient donc 00, et le quotient vaut 00 au lieu de 11. Il y a deux erreurs qui se combattent : si hh est trop GRAND, l'approximation mathématique est mauvaise, de l'ordre de 3h3h ; si hh est trop PETIT, la soustraction de deux nombres presque égaux détruit les chiffres significatifs. Le compromis se situe vers h=10−6h=10^{-6} à 10−810^{-8}. C'est un fait important : contrairement à l'intuition, diminuer indéfiniment le pas ne rend pas le résultat plus juste.

Le fil : la limite mathématique et le calcul en machine ne coïncident que dans une fenêtre. Le programme montre la convergence, la factorisation la démontre, et la représentation des flottants explique pourquoi la table s'arrête de progresser.

0,511,52−2−112sécante h = 0,5 : pente 2,75tangente en 1 : pente 1

Exercice 5 : Discriminant et nombre de racines

On veut écrire une fonction nb_racines(a, b, c) qui renvoie le nombre de solutions réelles de l'équation ax2+bx+c=0ax^2+bx+c=0.

  • a) Écrivez cette fonction à l'aide d'un if, d'un elif et d'un else.
  • b) Que renvoie-t-elle pour x2−4x+4=0x^2-4x+4=0, pour 2x2+x+3=02x^2+x+3=0 et pour x2−5x+6=0x^2-5x+6=0 ? Justifiez chaque valeur.
  • c) Que renvoie nb_racines(0, 3, -6) ? Pourquoi la réponse est-elle mathématiquement fausse, et comment corriger la fonction ?
  • d) Écrivez une fonction racines(a, b, c) qui affiche les solutions lorsqu'il y en a.

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

b)
c)
Voir la correction

Réponses

  • a) Tests if d > 0, elif d == 0, else
  • b) 11 ; 00 ; 22
  • c) Renvoie 22 au lieu de 11 : traiter a=0a=0 d'abord
  • d) Calculer sqrt(d) seulement si d≥0d\geq 0
a)

def nb_racines(a, b, c): puis d = b*b - 4*a*c puis if d > 0: puis return 2 puis elif d == 0: puis return 1 puis else: puis return 0. L'ordre des tests importe : écrire if d >= 0: return 2 fusionnerait à tort le cas de la racine double avec celui des deux racines distinctes.

b)

Pour x2−4x+4x^2-4x+4 : Δ=16−16=0\Delta=16-16=0, la fonction renvoie 11. L'équation admet la racine double x=42=2x=\frac{4}{2}=2, ce que confirme la factorisation (x−2)2(x-2)^2. Pour 2x2+x+32x^2+x+3 : Δ=1−24=−23<0\Delta=1-24=-23<0, la fonction renvoie 00 et la parabole ne coupe pas l'axe des abscisses. Pour x2−5x+6x^2-5x+6 : Δ=25−24=1>0\Delta=25-24=1>0, la fonction renvoie 22, et les racines sont 5−12=2\frac{5-1}{2}=2 et 5+12=3\frac{5+1}{2}=3.

c)

Elle calcule Δ=32−0=9>0\Delta=3^2-0=9>0 et renvoie 22. C'est faux : avec a=0a=0 l'équation n'est pas du second degré, elle s'écrit 3x−6=03x-6=0 et n'a qu'UNE solution, x=2x=2. La formule du discriminant n'a de sens que pour a≠0a\ne 0, hypothèse que le programme ne vérifie pas. On corrige en plaçant un test en tête : if a == 0: puis if b == 0: puis return 0 puis return 1. Ce cas a=0a=0 est régulièrement introduit en contrôle par un paramètre, par exemple (m−1)x2+3x−6=0(m-1)x^2+3x-6=0 avec m=1m=1, et l'oublier coûte tous les points de la question.

d)

def racines(a, b, c): puis d = b*b - 4*a*c puis if d > 0: puis print((-b - sqrt(d))/(2*a), (-b + sqrt(d))/(2*a)) puis elif d == 0: puis print(-b/(2*a)), la fonction sqrt étant importée du module math. On n'écrit jamais sqrt(d) avant de savoir que d≥0d\ge 0 : la racine carrée d'un nombre négatif provoque une erreur qui interrompt le programme. Le test doit donc précéder le calcul, et non l'inverse.

Le fil : un programme de second degré est un arbre de cas, et chaque branche correspond à une phrase du cours. Les deux cas que l'on oublie sont toujours les mêmes, la racine double et le coefficient aa nul.

def nb_racines(a, b, c):
    if a == 0:
        if b == 0:
            return 0
        return 1
    d = b*b - 4*a*c
    if d > 0:
        return 2
    elif d == 0:
        return 1
    else:
        return 0

Partie B : problèmes et raisonnement (/50)

Exercice 6 : Espérance et écart-type d'une variable aléatoire

Une variable aléatoire XX prend les valeurs 00, 11, 22 et 33 avec les probabilités respectives 0,10{,}1, 0,30{,}3, 0,40{,}4 et 0,20{,}2. En Python, on stocke x = [0, 1, 2, 3] et p = [0.1, 0.3, 0.4, 0.2].

  • a) Écrivez un programme qui calcule E(X)E(X) à l'aide d'une boucle, et donnez sa valeur.
  • b) Écrivez un programme qui calcule V(X)V(X) par la formule V(X)=E(X2)−E(X)2V(X)=E(X^2)-E(X)^2, puis l'écart-type.
  • c) Écrivez une fonction loi_valide(p) qui vérifie que la liste des probabilités définit bien une loi. Pourquoi ne faut-il pas y écrire if s == 1 ?
  • d) On répète l'expérience 10 00010\,000 fois et l'on obtient une moyenne de 1,721{,}72. Ce résultat est-il compatible avec l'espérance calculée ? E(X)E(X) est-elle une valeur prise par XX ?

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

a)
b)
c)
d)
Voir la correction

Réponses

  • a) E(X)=1,7E(X)=1{,}7
  • b) V(X)=0,81V(X)=0{,}81, σ=0,9\sigma=0{,}9
  • c) Tester abs(s - 1) < 1e-9 et la positivité
  • d) Compatible ; 1,71{,}7 n'est pas une valeur de XX
a)

E = 0 puis for i in range(len(x)): puis E = E + x[i]*p[i] puis print(E). On obtient E(X)=0×0,1+1×0,3+2×0,4+3×0,2=0+0,3+0,8+0,6=1,7E(X)=0\times 0{,}1+1\times 0{,}3+2\times 0{,}4+3\times 0{,}2=0+0{,}3+0{,}8+0{,}6=1{,}7. La boucle parcourt les INDICES et non les valeurs, parce qu'il faut avancer simultanément dans les deux listes : c'est la structure à connaître dès que deux tableaux se correspondent terme à terme.

b)

E2 = 0 puis for i in range(len(x)): puis E2 = E2 + x[i]*x[i]*p[i], puis V = E2 - E*E et print(V, sqrt(V)). On a E(X2)=0×0,1+1×0,3+4×0,4+9×0,2=0,3+1,6+1,8=3,7E(X^2)=0\times 0{,}1+1\times 0{,}3+4\times 0{,}4+9\times 0{,}2=0{,}3+1{,}6+1{,}8=3{,}7, donc V(X)=3,7−1,72=3,7−2,89=0,81V(X)=3{,}7-1{,}7^2=3{,}7-2{,}89=0{,}81 et σ=0,81=0,9\sigma=\sqrt{0{,}81}=0{,}9. Attention à la place des carrés : dans E(X2)E(X^2) on élève les VALEURS au carré avant de multiplier par les probabilités, alors que dans E(X)2E(X)^2 on élève au carré le résultat final. Les deux ne sont jamais égaux dès que XX n'est pas constante, et leur différence est précisément la variance.

c)

def loi_valide(p): puis s = 0 puis for q in p: puis if q < 0: puis return False puis s = s + q puis return abs(s - 1) < 1e-9. On n'écrit pas s == 1 parce que la somme 0,1+0,3+0,4+0,20{,}1+0{,}3+0{,}4+0{,}2 ne vaut pas exactement 11 en machine : ces décimaux n'ont pas d'écriture finie en base deux, et la somme obtenue diffère de 11 d'environ 10−1610^{-16}. Le test d'égalité renverrait False pour une loi pourtant parfaitement valide. On teste donc un ÉCART, jamais une égalité, et l'on n'oublie pas la seconde condition d'une loi de probabilité : toutes les valeurs doivent être positives.

d)

Oui, c'est compatible. La loi des grands nombres dit que la moyenne observée sur un grand nombre de répétitions se rapproche de l'espérance : 1,721{,}72 est très proche de 1,71{,}7, l'écart de 0,020{,}02 est de l'ordre de σn=0,9100=0,009\frac{\sigma}{\sqrt{n}}=\frac{0{,}9}{100}=0{,}009 à quelques unités près, ce qui est banal. En revanche E(X)=1,7E(X)=1{,}7 n'est PAS une valeur prise par XX, qui ne prend que des entiers : l'espérance est la moyenne pondérée théorique, pas un résultat possible de l'expérience. C'est la même chose que le nombre moyen d'enfants par famille.

Le fil : deux listes qui se correspondent se parcourent par les indices, et toute vérification numérique se fait avec une inégalité. Ces deux réflexes valent pour les probabilités comme pour les mesures de sciences.

E = 0
E2 = 0
for i in range(len(x)):
    E = E + x[i]*p[i]
    E2 = E2 + x[i]*x[i]*p[i]
V = E2 - E*E
print(E, V, sqrt(V))

Exercice 7 : Compléter un programme : résolution approchée par balayage

Soit ff définie sur R\mathbb{R} par f(x)=x3+x−3f(x)=x^3+x-3. On admet que l'équation f(x)=0f(x)=0 possède une unique solution α\alpha, située entre 11 et 22.

Le programme suivant cherche un encadrement de α\alpha au centième. Trois éléments sont incomplets.

def f(x):
    return x**3 + x - 3

k = ...
while f(k/100) < ... :
    k = k + 1
print(..., k/100)
  • a) Complétez les trois éléments du programme.
  • b) Donnez l'encadrement obtenu, en précisant les deux valeurs de ff qui le justifient.
  • c) Démontrez que la solution est bien unique sur R\mathbb{R}.
  • d) Combien de tours la boucle effectue-t-elle ? Combien en faudrait-il pour un encadrement au millième ?

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

b)
d)
Voir la correction

Réponses

  • a) k = 100 ; f(k/100) < 0 ; (k-1)/100
  • b) 1,21<α<1,221{,}21<\alpha<1{,}22
  • c) f′(x)=3x2+1>0f'(x)=3x^{2}+1>0 : ff strictement croissante
  • d) 2222 tours ; 214214 au millième
a)

On part de k=100k=100, ce qui correspond à x=1x=1, on avance tant que ff reste négative, et l'on affiche l'encadrement final : k = 100, puis while f(k/100) < 0:, puis print((k-1)/100, k/100). Le balayage se fait sur un ENTIER kk et non directement sur xx, pour la raison vue en Seconde : additionner 0,010{,}01 des centaines de fois accumule les erreurs d'arrondi, alors qu'une division unique n'en accumule aucune.

b)

La boucle s'arrête à k=122k=122, donc 1,21<α<1,221{,}21<\alpha<1{,}22. Les deux valeurs qui le justifient sont f(1,21)=1,771561+1,21−3=−0,018439f(1{,}21)=1{,}771561+1{,}21-3=-0{,}018439, encore négative, et f(1,22)=1,815848+1,22−3=0,035848f(1{,}22)=1{,}815848+1{,}22-3=0{,}035848, devenue positive. La fonction change donc de signe entre ces deux abscisses. Une valeur plus fine, f(1,213)≈−0,00223f(1{,}213)\approx -0{,}00223, montre que α≈1,2134\alpha\approx 1{,}2134.

c)

La fonction ff est dérivable sur R\mathbb{R} avec f′(x)=3x2+1f'(x)=3x^2+1. Comme 3x2≥03x^2\ge 0, on a f′(x)≥1>0f'(x)\ge 1>0 pour tout réel xx : ff est STRICTEMENT CROISSANTE sur R\mathbb{R}. Elle prend donc au plus une fois chaque valeur, en particulier la valeur 00, ce qui donne l'unicité. L'existence vient du changement de signe entre f(1)=−1f(1)=-1 et f(2)=7f(2)=7. Le programme, lui, ne démontre rien de tout cela : il trouve UNE solution, et rien dans son affichage ne dit qu'il n'y en a pas d'autres ailleurs.

d)

Elle part de k=100k=100 et s'arrête à k=122k=122, donc elle effectue 2222 tours. Pour un encadrement au millième, on balaierait avec k/1000k/1000 à partir de k=1000k=1000 jusqu'à k=1214k=1214, soit 214214 tours : diviser le pas par dix multiplie par dix le nombre de tours pour une décimale de plus. C'est le défaut du balayage, et c'est pourquoi on lui préfère la dichotomie quand la précision demandée est grande : celle-ci divise l'intervalle par deux à chaque tour et gagne une décimale toutes les trois ou quatre étapes.

Le fil : le programme FOURNIT un encadrement, le calcul de la dérivée DÉMONTRE qu'il n'y a rien d'autre à chercher. Une question de contrôle qui demande de justifier l'unicité attend le tableau de variations, jamais la sortie du programme.

def f(x):
    return x**3 + x - 3

k = 100
while f(k/100) < 0:
    k = k + 1
print((k-1)/100, k/100)
0,511,52−3−2−112345f croissante : un seul zéro1,21 < α < 1,22

Exercice 8 : Cinq affirmations à corriger

Chacune des cinq affirmations suivantes est FAUSSE. Dites pourquoi, puis énoncez la version correcte.

  • a) « Le taux d'accroissement f(a+h)−f(a)h\frac{f(a+h)-f(a)}{h} devient exactement égal à f′(a)f'(a) lorsque l'on prend h=0h=0. »
  • b) « Pour tester le signe du discriminant, if delta >= 0: return 2 suffit, puisqu'une racine double compte pour deux racines. »
  • c) « Si une suite converge vers LL, alors la boucle while u < L finit toujours par s'arrêter. »
  • d) « L'espérance d'une variable aléatoire est la valeur qu'elle a le plus de chances de prendre. »
  • e) « Plus le pas d'un balayage est petit, plus le résultat obtenu en machine est précis, sans limite. »

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

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

Réponses

  • a) f′(a)f'(a) est une limite
  • b) Δ=0\Delta=0 : une racine double
  • c) Seulement pour un seuil strictement inférieur à la limite
  • d) C'est le mode, pas l'espérance
  • e) Il existe un pas optimal
a)

FAUX. Pour h=0h=0, le quotient n'existe pas : son dénominateur est nul. Le nombre dérivé est une LIMITE, c'est-à-dire la valeur dont le taux se rapproche autant qu'on veut quand hh tend vers 00, sans jamais y être évalué. Version correcte : « f′(a)f'(a) est la limite du taux d'accroissement quand hh tend vers 00 ». La différence est visible sur l'exercice 4 : le taux vaut 1+3h+h21+3h+h^2, expression qui a bien une valeur en 00, mais seulement APRÈS simplification par hh, opération licite uniquement pour h≠0h\ne 0.

b)

FAUX. Si Δ=0\Delta=0, l'équation admet UNE racine, dite double, x0=−b2ax_0=-\frac{b}{2a} : la parabole est tangente à l'axe des abscisses et ne le coupe qu'en un point. Version correcte : « on teste Δ>0\Delta>0 pour deux racines, puis Δ=0\Delta=0 pour une racine double, puis Δ<0\Delta<0 pour aucune ». Dire qu'une racine double « compte pour deux » a un sens en factorisation, ax2+bx+c=a(x−x0)2ax^2+bx+c=a(x-x_0)^2, mais pas quand on dénombre les solutions.

c)

FAUX. Une suite convergente peut approcher sa limite sans jamais l'atteindre ni la dépasser. Avec un=15−13×0,8 nu_n=15-13\times 0{,}8^{\,n} de l'exercice 2, la boucle while u < 15 ne s'arrête JAMAIS. Version correcte : « la boucle s'arrête pour tout seuil strictement inférieur à la limite, si la suite est croissante ». C'est la vérification à faire avant d'écrire tout programme de seuil : le seuil demandé est-il réellement franchi ?

d)

FAUX, cela confond espérance et mode. L'espérance est la moyenne PONDÉRÉE des valeurs, E(X)=∑xipiE(X)=\sum x_i p_i, et elle n'est en général même pas une valeur prise par XX : à l'exercice 6, E(X)=1,7E(X)=1{,}7 alors que XX ne prend que les entiers 00 à 33. La valeur la plus probable, ici 22 avec p=0,4p=0{,}4, s'appelle le mode. Version correcte : « l'espérance est la moyenne des valeurs pondérée par leurs probabilités ».

e)

FAUX. Deux erreurs s'opposent : l'erreur de méthode, proportionnelle au pas, et l'erreur d'arrondi, qui augmente quand le pas diminue, car on soustrait des nombres de plus en plus proches. En dessous d'un certain pas, le résultat se dégrade au lieu de s'améliorer, jusqu'au cas extrême de l'exercice 4 où 1+10−171+10^{-17} vaut 11. Version correcte : « il existe un pas optimal, au-delà duquel la précision machine limite le gain ».

Ces cinq erreurs se ressemblent : chacune consiste à transporter en machine une propriété mathématique exacte, ou l'inverse. L'ordinateur travaille avec des nombres approchés et un nombre fini d'étapes, ce que le cours d'analyse ne fait jamais.

Exercice 9 : Décroissance radioactive et méthode d'Euler

L'iode 131131 a une demi-vie de 8,08{,}0 jours. Le nombre de noyaux restants est modélisé par N(t)=N0 e−λtN(t)=N_{0}\,\mathrm{e}^{-\lambda t}, où tt est en jours et λ=0,086 643\lambda=0{,}086\,643 jour−1^{-1}, valeur choisie pour que e−8λ=12\mathrm{e}^{-8\lambda}=\frac{1}{2}. La vitesse de désintégration vérifie N′(t)=−λN(t)N'(t)=-\lambda N(t).

On approche l'évolution par la méthode d'Euler : sur un petit intervalle Δt\Delta t, on considère la vitesse comme constante, ce qui donne Nk+1=Nk(1−λ Δt)N_{k+1}=N_k\left(1-\lambda\,\Delta t\right).

  • a) Vérifiez à la calculatrice que e−8λ≈0,5\mathrm{e}^{-8\lambda}\approx 0{,}5, puis écrivez un programme qui affiche la fraction de noyaux restants après 88 jours avec un pas Δt=1\Delta t=1 jour.
  • b) Comparez le résultat obtenu à la valeur exacte. Quel est l'écart relatif ?
  • c) Reprenez avec un pas Δt=0,1\Delta t=0{,}1 jour. Que constate-t-on sur l'erreur ?
  • d) Démontrez que la méthode d'Euler sous-estime TOUJOURS le nombre de noyaux restants.

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

a)
b)
c)
Voir la correction

Réponses

  • a) e−8λ≈0,5\mathrm{e}^{-8\lambda}\approx 0{,}5 ; programme : ≈0,4843\approx 0{,}4843
  • b) Écart relatif ≈3,1 %\approx 3{,}1\ \%
  • c) ≈0,4985\approx 0{,}4985, écart ≈0,3 %\approx 0{,}3\ \% : erreur divisée par dix
  • d) 1−x<e−x1-x<\mathrm{e}^{-x} pour x>0x>0
a)

e−8×0,086 643=e−0,693 144≈0,5000\mathrm{e}^{-8\times 0{,}086\,643}=\mathrm{e}^{-0{,}693\,144}\approx 0{,}5000 : c'est bien la demi-vie de 88 jours. Le programme s'écrit lam = 0.086643 puis N = 1 puis for k in range(8): puis N = N*(1 - lam*1) puis print(N). On travaille en fraction, c'est-à-dire avec N0=1N_0=1, ce qui évite d'avoir à choisir un nombre de noyaux et rend le résultat directement comparable à 12\frac{1}{2}.

b)

Le programme affiche environ 0,48430{,}4843. La valeur exacte est 12\frac{1}{2} par définition de la demi-vie, ce que confirme le modèle : N(8)=N0 e−8λ=N02N(8)=N_{0}\,\mathrm{e}^{-8\lambda}=\frac{N_{0}}{2}. L'écart relatif vaut 0,5−0,48430,5≈3,1%\frac{0{,}5-0{,}4843}{0{,}5}\approx 3{,}1\%, ce qui est considérable pour une grandeur physique : la méthode d'Euler avec un pas d'un jour n'est pas utilisable ici, parce que le pas n'est pas petit devant la demi-vie.

c)

On écrit for k in range(80): puis N = N*(1 - lam*0.1), et l'on obtient environ 0,49850{,}4985, soit un écart relatif de 0,3%0{,}3\%. Diviser le pas par dix a divisé l'erreur par dix, ce qui est la signature de la méthode d'Euler : son erreur est proportionnelle au pas. Pour gagner un facteur cent sur la précision, il faut donc cent fois plus de tours de boucle, et c'est ce compromis qui décide en pratique du pas choisi.

d)

Sur un pas, la méthode donne Nk(1−λΔt)N_k(1-\lambda\Delta t) alors que la solution exacte donne Nke−λΔtN_ke^{-\lambda\Delta t}. Or pour tout réel x>0x>0 on a 1−x<e−x1-x<e^{-x} : il suffit d'étudier g(x)=e−x−1+xg(x)=e^{-x}-1+x, dont la dérivée g′(x)=1−e−xg'(x)=1-e^{-x} est strictement positive pour x>0x>0, avec g(0)=0g(0)=0, donc g(x)>0g(x)>0. En posant x=λΔtx=\lambda\Delta t, chaque pas d'Euler retire donc un peu TROP de noyaux, et ces sous-estimations se multiplient d'un pas à l'autre. La raison physique est claire : Euler applique pendant tout l'intervalle la vitesse de désintégration du DÉBUT du pas, alors que la vitesse réelle diminue à mesure que les noyaux disparaissent.

Le fil : la méthode d'Euler transforme la relation N′=−λNN'=-\lambda N en suite géométrique de raison 1−λΔt1-\lambda\Delta t, objet parfaitement connu du programme de Première. L'exponentielle est la limite de ces suites quand le pas tend vers zéro, et l'inégalité 1−x<e−x1-x<e^{-x} dit dans quel sens on se trompe.

lam = 0.086643
N = 1
for k in range(80):
    N = N*(1 - lam*0.1)
print(N)
2468101214160,20,40,60,81courbe : modèle exactpoints : Euler,pas de 1 jourdemi-vie : 0,5 à t = 8 jours

Exercice 10 : Problème de synthèse : trajectoire d'un ballon

Un ballon est frappé depuis une hauteur de 1,81{,}8 m. Dans un repère où xx est la distance horizontale en mètres et yy la hauteur en mètres, sa trajectoire est décrite par y(x)=−0,05x2+0,8x+1,8y(x)=-0{,}05x^2+0{,}8x+1{,}8.

Un mur de 44 m de haut se dresse à 1414 m du point de frappe.

La figure ci-dessous représente la situation.

2468101214161820123456frappe à 1,8 mmur de 4 mx (m)y (m)
  • a) Écrivez un programme qui balaie xx de 00 à 2020 m par pas de 0,50{,}5 m et affiche la hauteur maximale atteinte, puis donnez cette valeur.
  • b) Retrouvez l'abscisse du sommet par la dérivée, et donnez la hauteur maximale exacte.
  • c) Calculez la portée du tir, c'est-à-dire la distance au bout de laquelle le ballon touche le sol.
  • d) Le ballon passe-t-il au-dessus du mur ? Écrivez le programme qui répond, et démontrez le résultat par le calcul.

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

a)
b)
c)
d)
Voir la correction

Réponses

  • a) 55 m
  • b) y′(x)=−0,1x+0,8y'(x)=-0{,}1x+0{,}8 : sommet en 88 m, hauteur 55 m
  • c) Portée 1818 m
  • d) y(14)=3,2<4y(14)=3{,}2<4 : le ballon ne passe pas
a)

def y(x): puis return -0.05*x*x + 0.8*x + 1.8, puis M = 0 puis for k in range(0, 41): puis if y(k/2) > M: puis M = y(k/2) puis print(M). Le programme affiche 55, atteint pour x=8x=8 m. Comme d'habitude, on boucle sur l'entier kk et l'on pose x=k2x=\frac{k}{2} ; range(0, 41) donne bien les 4141 abscisses de 00 à 2020 m.

b)

La dérivée vaut y′(x)=−0,1x+0,8y'(x)=-0{,}1x+0{,}8, qui s'annule en x=0,80,1=8x=\frac{0{,}8}{0{,}1}=8 m. Elle est positive avant et négative après, donc yy atteint son MAXIMUM en 88 : y(8)=−0,05×64+0,8×8+1,8=−3,2+6,4+1,8=5y(8)=-0{,}05\times 64+0{,}8\times 8+1{,}8=-3{,}2+6{,}4+1{,}8=5 m. Le balayage donnait la même valeur, mais par chance : le sommet tombait exactement sur une abscisse balayée. Avec un pas de 0,70{,}7 m, il aurait donné une valeur légèrement inférieure, et c'est pourquoi une hauteur maximale se justifie toujours par la dérivée ou par la forme canonique.

c)

On résout −0,05x2+0,8x+1,8=0-0{,}05x^2+0{,}8x+1{,}8=0. En multipliant par −20-20 : x2−16x−36=0x^2-16x-36=0, donc Δ=256+144=400\Delta=256+144=400 et Δ=20\sqrt{\Delta}=20. Les racines sont 16−202=−2\frac{16-20}{2}=-2 et 16+202=18\frac{16+20}{2}=18. Seule la racine positive a un sens physique : la portée est de 1818 m. La racine −2-2 correspond au point d'où serait parti le ballon s'il avait décollé du sol avec la même parabole, information sans objet ici.

d)

if y(14) > 4: puis print("passe") puis else: puis print("touche le mur"). On calcule y(14)=−0,05×196+0,8×14+1,8=−9,8+11,2+1,8=3,2y(14)=-0{,}05\times 196+0{,}8\times 14+1{,}8=-9{,}8+11{,}2+1{,}8=3{,}2 m, ce qui est INFÉRIEUR à 44 m : le ballon ne passe pas. On peut préciser où il aurait fallu placer le mur : résoudre y(x)=4y(x)=4 donne −0,05x2+0,8x−2,2=0-0{,}05x^2+0{,}8x-2{,}2=0, soit x2−16x+44=0x^2-16x+44=0, de discriminant 256−176=80256-176=80 et de racines 16±452=8±25\frac{16\pm 4\sqrt5}{2}=8\pm 2\sqrt5, c'est-à-dire environ 3,533{,}53 m et 12,4712{,}47 m. Le ballon est donc au-dessus de 44 m entre ces deux abscisses seulement, et le mur à 1414 m est trop loin de 1,51{,}5 m environ.

Le fil de la série se referme ici : le balayage EXPLORE, la dérivée LOCALISE, le discriminant DÉCIDE. Un programme seul aurait répondu à d) mais n'aurait donné ni la hauteur exacte, ni la portée, ni l'intervalle de franchissement, qui sont les trois résultats attendus dans un exercice de contrôle.

def y(x):
    return -0.05*x*x + 0.8*x + 1.8

M = 0
for k in range(0, 41):
    if y(k/2) > M:
        M = y(k/2)
print(M)

if y(14) > 4:
    print("passe")
else:
    print("touche le mur")
2468101214161820123456sommet (8 ; 5)mur de 4 mportée 18 my(14) = 3,2 m : le ballon ne passe pas

Partie C : les classiques (/50)

Exercice 11 : Construire et exploiter une liste de termes

On considère la suite définie pour tout entier naturel nn par un=n2−7n+15u_{n}=n^{2}-7n+15, et le programme suivant.

L = [n*n - 7*n + 15 for n in range(10)]
print(L)
print(min(L))
  • a) Quelle liste contient la variable L ?
  • b) Que renvoie min(L) ? Pour quels rangs ce minimum est-il atteint ?
  • c) Complétez le programme pour qu'il affiche le nombre de termes de L strictement inférieurs à 1010, et donnez ce nombre.
  • d) On construit D = [L[i+1] - L[i] for i in range(9)]. Que contient D ? Justifiez par le calcul de un+1−unu_{n+1}-u_{n}.
  • e) Que renvoie sum(L) ?

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

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

Réponses

  • a) [15, 9, 5, 3, 3, 5, 9, 15, 23, 33]
  • b) 33, aux rangs 33 et 44
  • c) 66 termes
  • d) D = [-6, -4, ..., 10] : un+1−un=2n−6u_{n+1}-u_n=2n-6
  • e) 120120
a)

La liste en compréhension calcule unu_{n} pour nn allant de 00 à 99, soit dix termes : L = [15, 9, 5, 3, 3, 5, 9, 15, 23, 33]. On contrôle deux termes : u0=15u_{0}=15 et u9=81−63+15=33u_{9}=81-63+15=33 ✓.

b)

min(L) renvoie 33, atteint aux rangs 33 et 44 (les indices 33 et 44 de la liste, qui commence à l'indice 00). C'est cohérent avec la fonction x↦x2−7x+15x\mapsto x^{2}-7x+15, dont le sommet est en x=3,5x=3{,}5, au milieu de 33 et 44, qui sont donc à égale distance du sommet.

c)

On ajoute un compteur : c = 0, puis for u in L:, puis if u < 10:, puis c = c + 1, et enfin print(c). Les termes inférieurs à 1010 sont 99, 55, 33, 33, 55 et 99 : le programme affiche 66. Parcourir directement les VALEURS de la liste suffit ici, puisqu'on n'a pas besoin des rangs.

d)

D = [-6, -4, -2, 0, 2, 4, 6, 8, 10]. En effet un+1−un=(n+1)2−7(n+1)+15−(n2−7n+15)=2n+1−7=2n−6u_{n+1}-u_{n}=(n+1)^{2}-7(n+1)+15-(n^{2}-7n+15)=2n+1-7=2n-6. Les écarts forment une suite ARITHMÉTIQUE de raison 22 : c'est la signature d'une suite du second degré. Le signe de 2n−62n-6 explique aussi b) : la suite décroît tant que n<3n<3, stagne de u3u_{3} à u4u_{4}, puis croît.

e)

sum(L) renvoie 15+9+5+3+3+5+9+15+23+33=12015+9+5+3+3+5+9+15+23+33=120.

Une liste en compréhension est la traduction directe de « la liste des unu_{n} pour nn de 00 à 99 ». Les fonctions min, sum et les listes d'écarts transforment ensuite des questions de cours, minimum, sens de variation, somme, en une ligne de programme ; mais seul le calcul de un+1−unu_{n+1}-u_{n} justifie ce que la liste montre.

L = [n*n - 7*n + 15 for n in range(10)]
c = 0
for u in L:
    if u < 10:
        c = c + 1
print(c)
D = [L[i+1] - L[i] for i in range(9)]
print(D, sum(L))

Exercice 12 : La méthode d'Archimède pour approcher π

Archimède encadrait π\pi par les périmètres de polygones réguliers inscrits dans un cercle de rayon 11. On note cnc_{n} le côté du polygone régulier à nn côtés inscrit ; son demi-périmètre n cn2\frac{n\,c_{n}}{2} approche π\pi par défaut.

On admet la formule de doublement c2n=2−4−cn2c_{2n}=\sqrt{2-\sqrt{4-c_{n}^{2}}}, obtenue par le théorème de Pythagore dans le cercle.

La figure ci-dessous représente la situation.

O1c₆c₁₂
from math import sqrt

def archimede(k):
    c = 1
    n = 6
    for i in range(k):
        ...
        ...
    return n*c/2
  • a) Justifiez que c6=1c_{6}=1, puis calculez le demi-périmètre de l'hexagone.
  • b) Calculez c12c_{12} au millionième et le demi-périmètre du dodécagone au millième.
  • c) Écrivez un programme qui part de l'hexagone et double kk fois le nombre de côtés, puis affiche le demi-périmètre. Donnez les valeurs obtenues pour 4848 et 9696 côtés, au millième.
  • d) En doublant une vingtaine de fois, le programme affiche des valeurs de plus en plus fausses, puis 00. Expliquez ce phénomène.
  • e) Montrez que 2−4−c2=c22+4−c22-\sqrt{4-c^{2}}=\frac{c^{2}}{2+\sqrt{4-c^{2}}}, et déduisez-en une formule de doublement qui évite le problème.

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

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

Réponses

  • a) c6=1c_6=1, demi-périmètre 33
  • b) c12≈0,517 638c_{12}\approx 0{,}517\,638 ; ≈3,106\approx 3{,}106
  • c) ≈3,139\approx 3{,}139 et ≈3,141\approx 3{,}141
  • d) Soustraction de nombres presque égaux : perte des chiffres significatifs
  • e) c2n=cn2+4−cn2c_{2n}=\frac{c_n}{\sqrt{2+\sqrt{4-c_n^{2}}}}
a)

L'hexagone régulier inscrit se découpe en six triangles équilatéraux de côté égal au rayon : c6=1c_{6}=1. Son demi-périmètre vaut 6×12=3\frac{6\times 1}{2}=3, première approximation de π\pi, déjà connue des Babyloniens.

b)

c12=2−3≈0,267 949≈0,517 638c_{12}=\sqrt{2-\sqrt{3}}\approx\sqrt{0{,}267\,949}\approx 0{,}517\,638. Demi-périmètre : 12×0,517 6382≈3,106\frac{12\times 0{,}517\,638}{2}\approx 3{,}106.

c)

On initialise c = 1 et n = 6, puis, dans une boucle for exécutée k fois, on remplace c par sqrt(2 - sqrt(4 - c*c)) et n par 2*n ; on affiche enfin n*c/2. Avec 4848 côtés, on obtient environ 3,139 353{,}139\,35, soit 3,1393{,}139 ; avec 9696 côtés, environ 3,141 033{,}141\,03, soit 3,1413{,}141. C'est l'encadrement du polygone à 9696 côtés qu'avait atteint Archimède.

d)

Quand cc devient très petit, 4−c2\sqrt{4-c^{2}} est extrêmement proche de 22, et la différence 2−4−c22-\sqrt{4-c^{2}} soustrait deux nombres presque égaux. Les flottants ne gardant qu'une quinzaine de chiffres significatifs, cette différence perd presque tous ses chiffres justes, puis vaut exactement 00 quand c2c^{2} devient négligeable devant 44. C'est le même phénomène que pour le taux d'accroissement de l'exercice 4 avec un pas trop petit.

e)

On multiplie par la quantité conjuguée : (2−4−c2)(2+4−c2)=4−(4−c2)=c2\left(2-\sqrt{4-c^{2}}\right)\left(2+\sqrt{4-c^{2}}\right)=4-(4-c^{2})=c^{2}, d'où l'égalité. Donc c2n=cn22+4−cn2=cn2+4−cn2c_{2n}=\sqrt{\frac{c_{n}^{2}}{2+\sqrt{4-c_{n}^{2}}}}=\frac{c_{n}}{\sqrt{2+\sqrt{4-c_{n}^{2}}}}. Cette formule n'ADDITIONNE que des nombres positifs : plus aucune soustraction de nombres voisins, et le programme converge vers 3,141 592 653 589 793{,}141\,592\,653\,589\,79 sans jamais se dégrader.

Deux formules mathématiquement égales peuvent se comporter très différemment en machine. La quantité conjuguée, outil de calcul de limites au lycée, est aussi l'outil qui réécrit une soustraction instable en une division stable : c'est un réflexe de programmeur autant que de mathématicien.

from math import sqrt

def archimede(k):
    c = 1
    n = 6
    for i in range(k):
        c = c/sqrt(2 + sqrt(4 - c*c))
        n = 2*n
    return n*c/2

print(archimede(3), archimede(4))

Exercice 13 : Géométrie repérée en Python

Un point du plan est représenté par une liste de deux nombres, par exemple A = [1, 2]. On veut écrire trois fonctions de géométrie repérée.

  • a) Écrivez une fonction alignes(A, B, C) qui renvoie True si les trois points sont alignés, à l'aide du déterminant des vecteurs AB⃗\vec{AB} et AC⃗\vec{AC}. Que renvoie-t-elle pour A(1 ;2)A(1\,;2), B(4 ;8)B(4\,;8) et C(−2 ;−4)C(-2\,;-4) ?
  • b) Écrivez une fonction equation(A, B) qui renvoie les coefficients aa, bb, cc d'une équation cartésienne ax+by+c=0ax+by+c=0 de la droite (AB)(AB). Donnez le résultat pour A(1 ;2)A(1\,;2) et B(4 ;8)B(4\,;8).
  • c) Écrivez une fonction perpendiculaires(A, B, C, D) qui teste si (AB)⊥(CD)(AB)\perp(CD). Que renvoie-t-elle pour A(1 ;2)A(1\,;2), B(4 ;8)B(4\,;8), C(1 ;2)C(1\,;2) et D(5 ;0)D(5\,;0) ?
  • d) Avec des points à coordonnées décimales, alignes([0, 0], [0.1, 0.3], [0.3, 0.9]) renvoie False. Pourquoi, et comment corriger la fonction ?

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

a)
b)
c)
d)
Voir la correction

Réponses

  • a) Déterminant nul : True
  • b) a=6a=6, b=−3b=-3, c=0c=0 : 2x−y=02x-y=0
  • c) AB⃗⋅CD⃗=0\vec{AB}\cdot\vec{CD}=0 : True
  • d) Arrondis binaires : tester abs(det) < 1e-9
a)

Les vecteurs AB⃗(xB−xA ;yB−yA)\vec{AB}(x_{B}-x_{A}\,;y_{B}-y_{A}) et AC⃗\vec{AC} sont colinéaires si et seulement si leur déterminant det⁡=(xB−xA)(yC−yA)−(yB−yA)(xC−xA)\det=(x_{B}-x_{A})(y_{C}-y_{A})-(y_{B}-y_{A})(x_{C}-x_{A}) est nul. Ici AB⃗(3 ;6)\vec{AB}(3\,;6) et AC⃗(−3 ;−6)\vec{AC}(-3\,;-6) : det⁡=3×(−6)−6×(−3)=0\det=3\times(-6)-6\times(-3)=0. La fonction renvoie True.

b)

Un vecteur directeur est AB⃗(u ;v)\vec{AB}(u\,;v) ; un vecteur normal est (v ;−u)(v\,;-u), d'où a=va=v, b=−ub=-u, puis c=−(a xA+b yA)c=-(a\,x_{A}+b\,y_{A}). Pour AB⃗(3 ;6)\vec{AB}(3\,;6) : a=6a=6, b=−3b=-3, c=−(6−6)=0c=-(6-6)=0. La droite a pour équation 6x−3y=06x-3y=0, soit 2x−y=02x-y=0. Vérification avec BB : 24−24=024-24=0 ✓.

c)

Les droites sont perpendiculaires si et seulement si AB⃗⋅CD⃗=0\vec{AB}\cdot\vec{CD}=0. AB⃗(3 ;6)\vec{AB}(3\,;6) et CD⃗(4 ;−2)\vec{CD}(4\,;-2) : 12−12=012-12=0. La fonction renvoie True.

d)

Mathématiquement, det⁡=0,1×0,9−0,3×0,3=0,09−0,09=0\det=0{,}1\times 0{,}9-0{,}3\times 0{,}3=0{,}09-0{,}09=0. Mais 0,10{,}1, 0,30{,}3 et 0,90{,}9 n'ont pas d'écriture finie en base deux : le calcul en machine donne un nombre de l'ordre de 10−1710^{-17}, et le test det == 0 échoue. On corrige en testant abs(det) < 1e-9. Tout test d'égalité entre flottants issus d'un calcul se remplace par un test d'écart.

La géométrie repérée se programme presque mot pour mot : un déterminant nul pour la colinéarité, un produit scalaire nul pour l'orthogonalité, l'échange des coordonnées pour passer du vecteur directeur au vecteur normal. Le seul ajout propre à la machine est la tolérance, indispensable dès que les coordonnées ne sont pas entières.

def alignes(A, B, C):
    d = (B[0]-A[0])*(C[1]-A[1]) - (B[1]-A[1])*(C[0]-A[0])
    return abs(d) < 1e-9

def equation(A, B):
    u, v = B[0]-A[0], B[1]-A[1]
    a, b = v, -u
    return a, b, -(a*A[0] + b*A[1])

def perpendiculaires(A, B, C, D):
    p = (B[0]-A[0])*(D[0]-C[0]) + (B[1]-A[1])*(D[1]-C[1])
    return abs(p) < 1e-9

Exercice 14 : La suite de Syracuse

On part d'un entier n≥1n\geq 1. S'il est pair, on le divise par 22 ; s'il est impair, on le multiplie par 33 et on ajoute 11. On recommence jusqu'à obtenir 11. La conjecture de Syracuse affirme qu'on atteint toujours 11, quel que soit l'entier de départ ; elle n'a jamais été démontrée.

Le TEMPS DE VOL est le nombre d'étapes pour atteindre 11, l'ALTITUDE MAXIMALE la plus grande valeur rencontrée.

  • a) Écrivez une fonction vol(n) qui renvoie la liste des valeurs, de nn jusqu'à 11 compris.
  • b) Donnez la liste obtenue pour n=7n=7, son temps de vol et son altitude maximale.
  • c) Pour n=27n=27, le programme donne un temps de vol de 111111. Quelle altitude maximale affiche-t-il ?
  • d) Écrivez un programme qui cherche, parmi les entiers de 11 à 9999, celui dont le temps de vol est le plus long. Il affiche 9797. Quel est ce temps de vol ?
  • e) Pourquoi la boucle while de la fonction vol ne constitue-t-elle pas une démonstration de la conjecture ?

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

b)
c)
d)
e)
Voir la correction

Réponses

  • a) Boucle while n != 1 avec n // 2 ou 3*n + 1
  • b) Temps de vol 1616, altitude maximale 5252
  • c) 9 2329\,232
  • d) 118118 étapes
  • e) Un programme ne teste qu'un nombre fini d'entiers
a)

On range nn dans une liste, puis tant que n != 1 : si n % 2 == 0, on remplace n par n // 2, sinon par 3*n + 1, et l'on ajoute chaque nouvelle valeur à la liste. L'opérateur // donne le quotient entier et garde un entier ; / donnerait un flottant, 11,011{,}0 au lieu de 1111.

b)

77, 2222, 1111, 3434, 1717, 5252, 2626, 1313, 4040, 2020, 1010, 55, 1616, 88, 44, 22, 11. La liste compte 1717 valeurs, donc 1616 étapes : le temps de vol vaut 1616, c'est-à-dire len(L) - 1, et non len(L). L'altitude maximale vaut 5252, bien plus que le départ.

c)

L'altitude maximale est 9 2329\,232, atteinte en partant de 2727 : un nombre de départ modeste peut monter très haut avant de redescendre, et c'est ce comportement erratique qui rend la conjecture si difficile.

d)

On garde le meilleur temps dans une variable, en parcourant for k in range(1, 100) et en comparant len(vol(k)) - 1 au record. Le record est atteint pour k=97k=97, avec un temps de vol de 118118 étapes ; son altitude maximale est aussi 9 2329\,232, car la trajectoire de 9797 rejoint celle de 2727.

e)

Le programme vérifie la conjecture pour chaque entier TESTÉ, en s'arrêtant quand il atteint 11. Si un entier ne l'atteignait jamais, la boucle tournerait indéfiniment et le programme ne répondrait rien : il ne peut ni prouver que tous les entiers conviennent, puisqu'il y en a une infinité, ni prouver qu'un entier ne convient pas. Des vérifications ont été menées sur des milliards de milliards d'entiers ; ce ne sont pas des démonstrations.

La suite de Syracuse est définie par récurrence, mais sans aucune formule explicite ni sens de variation : c'est l'exemple type où seul le programme permet d'explorer. Il fournit des conjectures et des contre-exemples potentiels ; la démonstration, elle, reste un travail de mathématicien, ici toujours inachevé.

def vol(n):
    L = [n]
    while n != 1:
        if n % 2 == 0:
            n = n // 2
        else:
            n = 3*n + 1
        L.append(n)
    return L

print(len(vol(7)) - 1, max(vol(7)), max(vol(27)))

record, meilleur = 0, 1
for k in range(1, 100):
    t = len(vol(k)) - 1
    if t > record:
        record, meilleur = t, k
print(meilleur, record)

Exercice 15 : La fluctuation des moyennes d'échantillons

On lance un dé équilibré ; on note XX le résultat. Un ÉCHANTILLON de taille nn est une série de nn lancers indépendants, dont on calcule la moyenne mm.

Le programme ci-dessous simule 1 0001\,000 échantillons de taille n=100n=100 et compte la proportion de ceux dont la moyenne mm vérifie ∣m−μ∣≤2σn|m-\mu|\leq\frac{2\sigma}{\sqrt{n}}, où μ\mu et σ\sigma sont l'espérance et l'écart-type de XX.

from random import randint
from math import sqrt

def moyenne(n):
    ...

mu, sigma = 3.5, sqrt(35/12)
c = 0
for i in range(1000):
    m = moyenne(100)
    if abs(m - mu) <= 2*sigma/sqrt(100):
        c = c + 1
print(c/1000)
  • a) Calculez μ=E(X)\mu=E(X) et σ=σ(X)\sigma=\sigma(X), ce dernier au millième.
  • b) Calculez 2σ100\frac{2\sigma}{\sqrt{100}} au millième. Complétez la fonction moyenne(n) du programme.
  • c) Le programme affiche une proportion d'environ 0,950{,}95. Les résultats diffèrent d'une exécution à l'autre : est-ce une erreur ?
  • d) On passe à des échantillons de taille 400400. Que devient la demi-largeur 2σn\frac{2\sigma}{\sqrt{n}} ?
  • e) Quelle taille minimale d'échantillon faut-il pour que 2σn≤0,1\frac{2\sigma}{\sqrt{n}}\leq 0{,}1 ?

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

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

Réponses

  • a) μ=3,5\mu=3{,}5, σ=3512≈1,708\sigma=\sqrt{\frac{35}{12}}\approx 1{,}708
  • b) ≈0,342\approx 0{,}342
  • c) Non : la proportion fluctue autour de 0,950{,}95
  • d) ≈0,171\approx 0{,}171, divisée par deux
  • e) n≥1 167n\geq 1\,167
a)

μ=1+2+3+4+5+66=3,5\mu=\frac{1+2+3+4+5+6}{6}=3{,}5. E(X2)=1+4+9+16+25+366=916E(X^{2})=\frac{1+4+9+16+25+36}{6}=\frac{91}{6}, donc V(X)=916−3,52=3512V(X)=\frac{91}{6}-3{,}5^{2}=\frac{35}{12} et σ=3512≈1,708\sigma=\sqrt{\frac{35}{12}}\approx 1{,}708.

b)

2×1,70810≈0,342\frac{2\times 1{,}708}{10}\approx 0{,}342. La fonction moyenne(n) additionne n tirages randint(1, 6) dans un accumulateur initialisé à 00, puis renvoie la somme divisée par n.

c)

Non. Chaque exécution tire de nouveaux nombres au hasard, donc de nouveaux échantillons : la proportion observée fluctue elle aussi, en restant voisine de 0,950{,}95. C'est le résultat attendu : environ 95 %95\ \% des moyennes d'échantillons tombent à moins de 2σn\frac{2\sigma}{\sqrt{n}} de l'espérance.

d)

2σ400=2×1,70820≈0,171\frac{2\sigma}{\sqrt{400}}=\frac{2\times 1{,}708}{20}\approx 0{,}171 : quatre fois plus de lancers divisent la demi-largeur par DEUX seulement, car 400=2100\sqrt{400}=2\sqrt{100}.

e)

2σn≤0,1  ⟺  n≥20σ≈34,16  ⟺  n≥(20σ)2=400×3512≈1 166,7\frac{2\sigma}{\sqrt{n}}\leq 0{,}1\iff\sqrt{n}\geq 20\sigma\approx 34{,}16\iff n\geq(20\sigma)^{2}=400\times\frac{35}{12}\approx 1\,166{,}7. Il faut au moins 1 1671\,167 lancers par échantillon.

La moyenne d'un échantillon fluctue autour de l'espérance, et d'autant moins que l'échantillon est grand ; mais la précision progresse comme n\sqrt{n}, pas comme nn. C'est pourquoi un sondage deux fois plus précis coûte quatre fois plus cher, et c'est ce que la simulation permet d'observer avant de le démontrer.

def moyenne(n):
    s = 0
    for i in range(n):
        s = s + randint(1, 6)
    return s/n

Partie D : les listes et les algorithmes du programme (/60)

Exercice 16 : Listes : générer, filtrer, supprimer, parcourir

En Première, la seule notion nouvelle d'algorithmique est la LISTE. Le programme ci-dessous construit de trois façons la liste des diviseurs de 3636, puis fait travailler la suppression d'éléments et le parcours par indices.

# programme 1 : trois façons de construire une liste
L1 = [1, 2, 3, 4, 6, 9, 12, 18, 36]
L2 = []
for d in range(1, 37):
    if 36 % d == 0:
        L2.append(d)
L3 = [d for d in range(1, 37) if 36 % d == 0]

# programme 2 : retirer les nombres pairs de M
M = [2, 4, 5, 6, 8, 9]
for x in M:
    if x % 2 == 0:
        M.remove(x)
print(M)

# programme 3 : un parcours par indices
s = 0
for i in range(len(L3)):
    if i % 2 == 0:
        s = s + L3[i]
print(s)
  • a) Nommez les trois façons de générer une liste utilisées dans le programme 1. Les trois listes sont-elles égales ? Que valent len(L3) et L3[4] ?
  • b) On pose ET = [n for n in range(1, 41) if n % 4 == 0 and n % 6 == 0] et OU = [n for n in range(1, 41) if n % 4 == 0 or n % 6 == 0]. Donnez la liste ET, puis len(OU). Quel lien avec les ensembles ?
  • c) Le programme 2 devait retirer de M tous les nombres pairs. Qu'affiche-t-il ? Expliquez le résultat, puis choisissez une ligne qui fait correctement le travail.
  • d) Qu'affiche le programme 3 ? Et si l'on remplace sa boucle par un parcours des VALEURS, for x in L3, avec le test if x % 2 == 0 et l'ajout s = s + x ?

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

a)
b)
c)
d)
Voir la correction

Réponses

  • a) Extension, ajouts successifs, compréhension ; listes égales ; len(L3) =9=9, L3[4] =6=6
  • b) ET = [12, 24, 36] ; len(OU) =10+6−3=13=10+6-3=13 : intersection et réunion
  • c) [4, 5, 8, 9] : remove décale la liste ; M = [x for x in M if x % 2 != 0] donne [5, 9]
  • d) 5858 par les indices pairs ; 7878 par les valeurs paires
a)

L1 est écrite EN EXTENSION : on énumère ses éléments entre crochets. L2 est construite PAR AJOUTS SUCCESSIFS : on part de la liste vide [] et la méthode append ajoute un élément à la fin, à chaque diviseur rencontré. L3 est écrite EN COMPRÉHENSION : c'est la traduction mot à mot de l'ensemble {d∈{1,…,36} : d divise 36}\{d\in\{1,\dots,36\}\ :\ d \text{ divise } 36\}, la condition if jouant le rôle du « tel que ». Les deux boucles parcourent les entiers dans l'ordre croissant, donc les trois listes sont égales, éléments ET ordre compris : [1, 2, 3, 4, 6, 9, 12, 18, 36]. On a len(L3) =9=9. Les indices partent de 00 : L3[0] vaut 11, L3[1] vaut 22, et L3[4] est le CINQUIÈME élément, 66, pas 44. Le dernier élément est L3[8], c'est-à-dire L3[len(L3) - 1] ; écrire L3[9] provoque une erreur, l'indice n'existe pas.

b)

Le « and » ne garde que les entiers multiples de 44 ET de 66, c'est-à-dire les multiples de 1212 : ET = [12, 24, 36]. Le « or » garde ceux qui sont multiples de 44 OU de 66, et c'est un « ou » INCLUSIF : un multiple des deux est gardé une seule fois. Il y a 1010 multiples de 44 et 66 multiples de 66 entre 11 et 4040 ; les ajouter compte deux fois les trois multiples de 1212, donc len(OU) =10+6−3=13=10+6-3=13. En notant AA et BB ces deux ensembles, ET décrit l'intersection A∩BA\cap B et OU la réunion A∪BA\cup B, et l'on vient de retrouver Card(A∪B)=Card(A)+Card(B)−Card(A∩B)\text{Card}(A\cup B)=\text{Card}(A)+\text{Card}(B)-\text{Card}(A\cap B). Répondre 1616, c'est compter deux fois les multiples de 1212. Un « ou » EXCLUSIF, qui les écarterait, donnerait 13−3=1013-3=10 : en mathématiques comme en Python, « ou » est toujours inclusif.

c)

Il affiche [4, 5, 8, 9], et non [5, 9]. La boucle for avance d'un INDICE à chaque tour, pendant que remove décale vers la gauche tout ce qui suit l'élément retiré. Tour 1 : indice 00, x vaut 22, on le retire, M devient [4, 5, 6, 8, 9]. Tour 2 : indice 11, x vaut 55 : le 44, passé à l'indice 00, a été SAUTÉ. Tour 3 : indice 22, x vaut 66, retiré, M devient [4, 5, 8, 9]. Tour 4 : indice 33, x vaut 99 : le 88 a été sauté à son tour. La règle : on ne supprime jamais dans une liste pendant qu'on la parcourt. La bonne ligne construit une NOUVELLE liste par compréhension, M = [x for x in M if x % 2 != 0], qui donne [5, 9]. Pour mémoire, remove(v) retire la première occurrence de la VALEUR v, alors que pop(i) et del M[i] retirent l'élément d'INDICE i : M.remove(9) et M.pop(9) ne font pas du tout la même chose.

d)

Le programme 3 parcourt les INDICES 00 à 88 et additionne les éléments d'indice pair, L3[0], L3[2], L3[4], L3[6] et L3[8] : 1+3+6+12+36=581+3+6+12+36=58. La version modifiée parcourt les VALEURS et additionne celles qui sont paires : 2+4+6+12+18+36=782+4+6+12+18+36=78. Les deux programmes se ressemblent ligne à ligne et ne calculent pas la même chose : dans for i in range(len(L3)), le test porte sur la POSITION ; dans for x in L3, il porte sur la VALEUR. On parcourt par indices quand la position compte (voisins, rang d'un élément), et l'on itère sur les éléments sinon, ce qui est plus court et plus sûr.

Le fil de la partie D commence ici : une liste est un ensemble qu'on a RANGÉ. La compréhension traduit « l'ensemble des ... tels que ... », le and et le or traduisent l'intersection et la réunion, et le rang d'un élément se compte à partir de 00.

Exercice 17 : Factorielle et suite de Fibonacci

Pour un entier n⩾1n\geqslant 1, on note n!=1×2×⋯×nn!=1\times 2\times\cdots\times n la FACTORIELLE de nn. La suite de Fibonacci est définie par F0=0F_0=0, F1=1F_1=1 et, pour tout entier nn, Fn+2=Fn+1+FnF_{n+2}=F_{n+1}+F_n.

def fact(n):
    p = 1
    for k in range(1, n + 1):
        p = p * k
    return p

def fibo(n):
    a, b = 0, 1
    for k in range(n):
        a, b = b, a + b
    return a
  • a) Que renvoie fact(6) ? Que renverrait-elle si l'on initialisait p à 00 ?
  • b) Écrivez une boucle while qui affiche le plus petit entier nn tel que n!>106n!>10^{6}, et donnez cet entier en le justifiant par deux valeurs.
  • c) Montrez qu'après kk tours de boucle, a contient FkF_k et b contient Fk+1F_{k+1}. Que renvoie fibo(12) ?
  • d) Un élève remplace la ligne a, b = b, a + b par les deux lignes a = b puis b = a + b. Que renvoie alors fibo(12) ?
  • e) On construit la liste F des termes F0F_0 à F15F_{15} par ajouts successifs, puis P = [f for f in F if f % 2 == 0]. Combien la liste P contient-elle d'éléments ? Quels rangs ont les termes pairs ?

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

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

Réponses

  • a) 720720 ; avec p = 0, la fonction renvoie toujours 00
  • b) 1010, car 9!=362 880⩽106<10!=3 628 8009!=362\,880\leqslant 10^{6}<10!=3\,628\,800
  • c) Après kk tours, a =Fk=F_k et b =Fk+1=F_{k+1} ; fibo(12) renvoie 144144
  • d) 2 048=2112\,048=2^{11} : b double à chaque tour
  • e) 66 termes pairs, aux rangs multiples de 33
a)

La boucle multiplie p successivement par 11, 22, 33, 44, 55 et 66 : 1×2×3×4×5×6=7201\times 2\times 3\times 4\times 5\times 6=720, donc fact(6) renvoie 720720. Initialisée à 00, la variable p resterait nulle à chaque multiplication, et la fonction renverrait 00 pour tout nn. Un accumulateur de PRODUIT s'initialise à 11, élément neutre de la multiplication, comme un accumulateur de somme s'initialise à 00. Remarquer aussi le range(1, n + 1) : range(n) ferait démarrer k à 00 et annulerait le produit dès le premier tour.

b)

Le nombre de tours n'est pas connu d'avance, d'où un while : n = 1, p = 1, puis tant que p <= 10**6, on fait n = n + 1 puis p = p * n, et l'on affiche n à la sortie. On met à jour n AVANT de multiplier, pour que p contienne toujours n!. Le programme affiche 1010 : en effet 9!=362 880⩽1069!=362\,880\leqslant 10^{6} et 10!=3 628 800>10610!=3\,628\,800>10^{6}. La factorielle croît plus vite que toute suite géométrique : chaque tour multiplie par un facteur qui grandit lui-même.

c)

Avant la boucle, k=0k=0 tour : a vaut 0=F00=F_0 et b vaut 1=F11=F_1. Si après kk tours a vaut FkF_k et b vaut Fk+1F_{k+1}, le tour suivant range dans a l'ancien b, soit Fk+1F_{k+1}, et dans b l'ancien a plus l'ancien b, soit Fk+Fk+1=Fk+2F_k+F_{k+1}=F_{k+2} : la propriété passe au tour k+1k+1. Après nn tours, a contient donc FnF_n. Les termes sont 00, 11, 11, 22, 33, 55, 88, 1313, 2121, 3434, 5555, 8989, 144144 : fibo(12) renvoie F12=144F_{12}=144. L'affectation SIMULTANÉE a, b = b, a + b calcule les deux membres de droite avec les ANCIENNES valeurs, avant de ranger quoi que ce soit.

d)

Avec deux lignes, la seconde utilise le NOUVEAU a, qui vaut déjà b : b = a + b revient à b = b + b, et b DOUBLE à chaque tour. Tour 1 : a =1=1, b =2=2 ; tour 2 : a =2=2, b =4=4 ; tour 3 : a =4=4, b =8=8. Après kk tours, a vaut 2k−12^{k-1} : fibo(12) renvoie 211=2 0482^{11}=2\,048. Le programme tourne sans erreur et produit une suite géométrique au lieu de Fibonacci. Pour écrire la version en deux temps sans affectation simultanée, il faut une variable de sauvegarde : c = a + b, puis a = b, puis b = c.

e)

F = [0, 1] puis, pour n de 22 à 1515, F.append(F[n - 1] + F[n - 2]), ce qui donne les seize termes de F0=0F_0=0 à F15=610F_{15}=610. Les termes pairs sont 00, 22, 88, 3434, 144144 et 610610 : P contient 66 éléments, aux rangs 00, 33, 66, 99, 1212 et 1515, les multiples de 33. La liste le montre, le calcul l'explique : pair plus impair donne impair, impair plus impair donne pair, donc les parités se répètent selon le motif pair, impair, impair, pair, impair, impair... de période 33.

Deux suites, deux leçons de liste : la factorielle est une accumulation qu'on arrête par un seuil, Fibonacci une récurrence à deux termes qui exige de garder les deux derniers, et la liste de ses termes fait APPARAÎTRE une régularité que le calcul démontre ensuite.

Exercice 18 : Sécantes pour un pas donné, puis méthode de Newton

Soit ff la fonction définie sur [0 ;2][0\,;2] par f(x)=x3+2x−5f(x)=x^{3}+2x-5. On dresse d'abord la liste des coefficients directeurs des sécantes pour un pas hh donné, puis on approche la solution de f(x)=0f(x)=0 par la méthode de Newton. Dans le second programme, une ligne est à compléter.

def f(x):
    return x**3 + 2*x - 5

def d(x):
    return 3*x**2 + 2

h = 0.5
X = [k*h for k in range(4)]
P = [(f(x + h) - f(x))/h for x in X]
print(P)

x, n, ecart = 1, 0, 1
while ecart > 10**-6:
    y = ...
    ecart = abs(y - x)
    x = y
    n = n + 1
print(x, n)
  • a) Quelle liste X contient-elle ? Que contient P ? Donnez son premier et son dernier élément.
  • b) On reprend le programme avec h = 0.25 et X = [k*h for k in range(8)]. Combien P contient-elle d'éléments ? Que vaut le premier ? Que représente cette liste quand le pas diminue ?
  • c) Montrez que l'équation f(x)=0f(x)=0 a une unique solution α\alpha dans [1 ;2][1\,;2]. Déterminez l'équation de la tangente en 11 et l'abscisse x1x_1 du point où elle coupe l'axe des abscisses.
  • d) Justifiez qu'à chaque étape, xk+1=xk−f(xk)f′(xk)x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)}, puis calculez x2x_2.
  • e) Choisissez la ligne qui complète le second programme, puis donnez le nombre de tours et la valeur affichée, au millionième.

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

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

Réponses

  • a) X = [0, 0.5, 1.0, 1.5] ; P = [2.25, 3.75, 6.75, 11.25]
  • b) 88 pentes, la première 2,06252{,}0625 ; elles approchent f′(x)=3x2+2f'(x)=3x^{2}+2
  • c) f′>0f'>0, f(1)<0<f(2)f(1)<0<f(2) ; tangente y=5x−7y=5x-7, x1=1,4x_1=1{,}4
  • d) x2=1,4−0,5447,88≈1,3310x_2=1{,}4-\frac{0{,}544}{7{,}88}\approx 1{,}3310
  • e) y = x - f(x)/d(x) ; 55 tours ; α≈1,328269\alpha\approx 1{,}328269
a)

X = [0, 0.5, 1.0, 1.5] : les abscisses de 00 à 1,51{,}5 avec le pas 0,50{,}5, quatre valeurs puisque range(4) produit 00, 11, 22, 33. Chaque élément de P est la pente de la corde entre les points d'abscisses xx et x+hx+h. On a f(0)=−5f(0)=-5, f(0,5)=−3,875f(0{,}5)=-3{,}875, f(1)=−2f(1)=-2, f(1,5)=1,375f(1{,}5)=1{,}375 et f(2)=7f(2)=7, d'où P = [2.25, 3.75, 6.75, 11.25] : premier élément −3,875+50,5=2,25\frac{-3{,}875+5}{0{,}5}=2{,}25, dernier 7−1,3750,5=11,25\frac{7-1{,}375}{0{,}5}=11{,}25. Le calcul général le confirme : f(x+h)−f(x)h=3x2+3xh+h2+2\frac{f(x+h)-f(x)}{h}=3x^{2}+3xh+h^{2}+2, qui donne 2,252{,}25 en x=0x=0.

b)

range(8) produit huit abscisses, de 00 à 1,751{,}75, donc P contient 88 pentes, et la première vaut f(0,25)−f(0)0,25=3×0+0+0,0625+2=2,0625\frac{f(0{,}25)-f(0)}{0{,}25}=3\times 0+0+0{,}0625+2=2{,}0625. Le pas est une DONNÉE du programme : le diviser par deux double le nombre de sécantes pour couvrir le même intervalle. Quand hh tend vers 00, chaque pente 3x2+3xh+h2+23x^{2}+3xh+h^{2}+2 tend vers 3x2+2=f′(x)3x^{2}+2=f'(x) : la liste devient un tableau de valeurs approchées de la fonction dérivée.

c)

Toutes les pentes sont positives, ce qui SUGGÈRE que ff croît ; la preuve vient de la dérivée : f′(x)=3x2+2>0f'(x)=3x^{2}+2>0, donc ff est strictement croissante. Comme f(1)=−2<0f(1)=-2<0 et f(2)=7>0f(2)=7>0, l'équation f(x)=0f(x)=0 a une unique solution α\alpha dans [1 ;2][1\,;2] : c'est le cas FAVORABLE, une seule racine et une dérivée qui ne s'annule jamais. La tangente en 11 a pour équation y=f′(1)(x−1)+f(1)=5(x−1)−2y=f'(1)(x-1)+f(1)=5(x-1)-2, soit y=5x−7y=5x-7, d'ordonnée à l'origine −7-7. Elle coupe l'axe des abscisses quand 5x−7=05x-7=0, en x1=1,4x_1=1{,}4.

d)

En un point xkx_k, la tangente a pour équation y=f′(xk)(x−xk)+f(xk)y=f'(x_k)(x-x_k)+f(x_k). Elle coupe l'axe des abscisses quand y=0y=0, donc, f′(xk)f'(x_k) étant non nul, en x=xk−f(xk)f′(xk)x=x_k-\frac{f(x_k)}{f'(x_k)} : c'est xk+1x_{k+1}. On retrouve x1=1−−25=1,4x_1=1-\frac{-2}{5}=1{,}4. Puis f(1,4)=2,744+2,8−5=0,544f(1{,}4)=2{,}744+2{,}8-5=0{,}544 et f′(1,4)=5,88+2=7,88f'(1{,}4)=5{,}88+2=7{,}88, d'où x2=1,4−0,5447,88≈1,4−0,0690≈1,3310x_2=1{,}4-\frac{0{,}544}{7{,}88}\approx 1{,}4-0{,}0690\approx 1{,}3310.

e)

La ligne manquante est y = x - f(x)/d(x), traduction directe de d). Les écarts successifs valent environ 0,40{,}4, puis 0,0690{,}069, puis 0,00270{,}0027, puis 4×10−64\times 10^{-6}, puis 9×10−129\times 10^{-12} : le cinquième tour est le premier dont l'écart passe sous 10−610^{-6}, donc n=5n=5, et le programme affiche x≈1,328269x\approx 1{,}328269. Le nombre de décimales justes DOUBLE presque à chaque tour. Contrôle : f(1,328)<0<f(1,329)f(1{,}328)<0<f(1{,}329). À titre de comparaison, un balayage de pas 10−610^{-6} parti de 11 ferait plus de 300 000300\,000 tours pour la même précision.

La liste des sécantes montre la pente, la dérivée la démontre, et la tangente sert ensuite d'outil : Newton remplace la courbe par sa tangente et recommence.

0,511,52−6−5−4−3−2−11234567cordes de pas 0,5 (pointillés)tangente en 1 : y = 5x − 7x1 = 1,4

Exercice 19 : Une valeur approchée de e par les intérêts composés

On place 11 dollar à un taux annuel de 100 %100\ \%. Si les intérêts sont versés en nn fois dans l'année, au taux 100n %\frac{100}{n}\ \% à chaque versement et toujours sur le capital déjà acquis, le capital au bout d'un an vaut un=(1+1n)nu_n=\left(1+\frac{1}{n}\right)^{n}. On admet que la suite (un)(u_n) est croissante et converge vers le nombre e≈2,718 281 8\mathrm{e}\approx 2{,}718\,281\,8.

from math import e

def u(n):
    return (1 + 1/n)**n

L = [u(n) for n in [1, 2, 4, 12, 365]]
print(L)

n = 1
while e - u(n) >= 0.001:
    n = n + 1
print(n)
  • a) Justifiez la formule donnant unu_n en écrivant le capital après chaque versement. Calculez à la main u1u_1, u2u_2 et u4u_4.
  • b) Donnez les deux dernières valeurs de la liste L, avec quatre décimales. Interprétez-les.
  • c) Que représente l'entier affiché par la boucle while ? Le programme affiche 1 3591\,359 : justifiez-le par deux valeurs, puis dites combien vaut à peu près l'écart e−un\mathrm{e}-u_n pour n=10 000n=10\,000.
  • d) Un élève affirme : « 1+1n1+\frac{1}{n} tend vers 11, donc unu_n tend vers 1n=11^{n}=1 ». Que répondre ? Et pourquoi Python affiche-t-il 1.0 pour u(10**16) ?

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

a)
b)
c)
d)
Voir la correction

Réponses

  • a) Chaque versement multiplie par 1+1n1+\frac{1}{n} ; u1=2u_1=2, u2=2,25u_2=2{,}25, u4≈2,4414u_4\approx 2{,}4414
  • b) u12≈2,6130u_{12}\approx 2{,}6130 ; u365≈2,7146u_{365}\approx 2{,}7146 : la suite croît vers e\mathrm{e}
  • c) Premier nn tel que e−un<0,001\mathrm{e}-u_n<0{,}001 ; écart ≈0,000 14\approx 0{,}000\,14 pour n=10 000n=10\,000
  • d) Faux : la base tend vers 11 mais l'exposant vers l'infini ; 1+10−161+10^{-16} vaut 11 en machine
a)

Chaque versement ajoute au capital 1n\frac{1}{n} de sa valeur : il le multiplie par 1+1n1+\frac{1}{n}. Après nn versements, le dollar de départ est devenu (1+1n)n\left(1+\frac{1}{n}\right)^{n} : c'est une suite géométrique de raison 1+1n1+\frac{1}{n} arrêtée au rang nn. À la main : u1=2u_1=2 (un seul versement de 100 %100\ \%, le capital double), u2=1,52=2,25u_2=1{,}5^{2}=2{,}25, u4=1,254=1,56252=2,441 406 25u_4=1{,}25^{4}=1{,}5625^{2}=2{,}441\,406\,25. Verser plus souvent rapporte davantage, parce que les intérêts produisent eux-mêmes des intérêts plus tôt.

b)

L = [2.0, 2.25, 2.44140625, 2.613..., 2.7145...] : u12≈2,6130u_{12}\approx 2{,}6130 (versement mensuel) et u365≈2,7146u_{365}\approx 2{,}7146 (versement quotidien). La suite croît, mais de moins en moins : passer de 1212 à 365365 versements ne rapporte qu'un dixième de dollar de plus. Même versé à chaque instant, le dollar ne dépasserait jamais e≈2,7183\mathrm{e}\approx 2{,}7183 dollars : c'est l'origine historique du nombre e\mathrm{e}, chez Jacques Bernoulli, en 1683.

c)

La boucle s'arrête au premier nn tel que e−un<0,001\mathrm{e}-u_n<0{,}001 : c'est le plus petit nombre de versements pour lequel unu_n approche e\mathrm{e} à moins d'un millième. La justification tient en deux valeurs : e−u1358≈0,001 000 1⩾0,001\mathrm{e}-u_{1358}\approx 0{,}001\,000\,1\geqslant 0{,}001 et e−u1359≈0,000 999 4<0,001\mathrm{e}-u_{1359}\approx 0{,}000\,999\,4<0{,}001. La convergence est LENTE : l'écart se comporte comme e2n\frac{\mathrm{e}}{2n}, et 2,7182×1 359≈0,001\frac{2{,}718}{2\times 1\,359}\approx 0{,}001 le confirme. Pour n=10 000n=10\,000, l'écart vaut donc à peu près 2,71820 000≈0,000 14\frac{2{,}718}{20\,000}\approx 0{,}000\,14 : dix fois plus de versements pour une seule décimale de plus.

d)

L'argument est faux, parce que la base tend vers 11 PENDANT que l'exposant tend vers l'infini : les deux effets se combattent, et aucune règle ne permet de passer à la limite dans la base seule. Les valeurs calculées le montrent, unu_n croît au-delà de 2,72{,}7, loin de 11. Quant à Python, le calcul de u(10**16) commence par 1+10−161+10^{-16}, et ce nombre n'est pas représentable : un flottant ne garde qu'une quinzaine de chiffres significatifs, donc 1+10−161+10^{-16} est arrondi à 11 exactement, et 11 élevé à n'importe quelle puissance reste 11. L'erreur est dans la MACHINE, pas dans les mathématiques, comme pour le taux d'accroissement de l'exercice 4 avec un pas trop petit.

La liste L montre la convergence, le while la chiffre, et le calcul à la main de u1u_1, u2u_2, u4u_4 vérifie les premiers éléments : ce sont les trois gestes de tout algorithme d'approximation.

Exercice 20 : Monte-Carlo : l'aire sous la parabole et le nombre π

On note D\mathcal{D} le domaine situé sous la parabole y=x2y=x^{2}, dans le carré [0 ;1]×[0 ;1][0\,;1]\times[0\,;1]. La fonction random() renvoie un nombre au hasard dans [0 ;1[[0\,;1[, uniformément. On tire nn points M(x ;y)M(x\,;y) au hasard dans le carré et l'on compte ceux qui tombent dans D\mathcal{D}.

0,250,50,7510,250,50,751MNy = x²
from random import random

def aire(n):
    c = 0
    for k in range(n):
        x = random()
        y = random()
        if ...:
            c = c + 1
    return c/n
  • a) Choisissez la condition qui complète le programme. Le point M(0,8 ;0,3)M(0{,}8\,;0{,}3) de la figure est-il compté ?
  • b) Pourquoi la proportion de points comptés estime-t-elle l'aire de D\mathcal{D} ? Un essai avec n=10 000n=10\,000 compte 3 3103\,310 points : quelle estimation obtient-on ?
  • c) On calcule bas = sum([(k/10)**2 for k in range(10)])/10 et haut = sum([(k/10)**2 for k in range(1, 11)])/10. Donnez ces deux valeurs et interprétez-les.
  • d) Pour estimer π\pi, on tire x = 2*random() - 1 et y = 2*random() - 1, et l'on compte les points tels que x**2 + y**2 <= 1. Sur 20 00020\,000 points, 15 70215\,702 sont comptés. Quelle estimation de π\pi en déduit-on, et pourquoi multiplie-t-on par 44 ?
  • e) Pour diviser par 22 l'erreur typique d'une telle estimation, par combien faut-il multiplier le nombre de points ?

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

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

Réponses

  • a) y <= x**2 ; MM est compté car 0,3⩽0,640{,}3\leqslant 0{,}64
  • b) Proportion == rapport des aires, le carré ayant pour aire 11 ; estimation 0,3310{,}331
  • c) bas =0,285=0{,}285, haut =0,385=0{,}385 : encadrement de l'aire par des rectangles
  • d) 4×15 70220 000=3,140 44\times\frac{15\,702}{20\,000}=3{,}140\,4 ; le carré [−1 ;1]2[-1\,;1]^{2} a pour aire 44
  • e) Par 44
a)

Le point M(x ;y)M(x\,;y) est sous la parabole quand son ordonnée ne dépasse pas celle du point de la courbe de même abscisse : la condition est y <= x**2. Pour M(0,8 ;0,3)M(0{,}8\,;0{,}3) : 0,82=0,640{,}8^{2}=0{,}64 et 0,3⩽0,640{,}3\leqslant 0{,}64, donc MM est compté. Le point N(0,3 ;0,6)N(0{,}3\,;0{,}6), lui, ne l'est pas : 0,32=0,09<0,60{,}3^{2}=0{,}09<0{,}6. Les conditions y >= x**2 et x <= y**2 décrivent d'autres régions du carré, la première le complémentaire de D\mathcal{D}.

b)

Les points sont répartis uniformément dans le carré : la probabilité qu'un point tombe dans D\mathcal{D} est le rapport des aires, aire(D)1\frac{\text{aire}(\mathcal{D})}{1}, puisque le carré a pour aire 11. La fréquence observée sur un grand nombre de tirages approche cette probabilité. Avec 3 3103\,310 points sur 10 00010\,000, l'estimation vaut 0,3310{,}331. Une autre exécution donnerait un nombre voisin mais différent : l'estimation fluctue, ce n'est pas une erreur de programme.

c)

bas =110(02+0,12+⋯+0,92)=2,8510=0,285=\frac{1}{10}\left(0^{2}+0{,}1^{2}+\cdots+0{,}9^{2}\right)=\frac{2{,}85}{10}=0{,}285 et haut =110(0,12+⋯+12)=3,8510=0,385=\frac{1}{10}\left(0{,}1^{2}+\cdots+1^{2}\right)=\frac{3{,}85}{10}=0{,}385. On découpe [0 ;1][0\,;1] en dix bandes de largeur 0,10{,}1 ; la fonction carré étant croissante sur [0 ;1][0\,;1], le rectangle de hauteur ff au bord GAUCHE est sous la courbe et celui de hauteur ff au bord DROIT la dépasse. D'où 0,285⩽aire(D)⩽0,3850{,}285\leqslant\text{aire}(\mathcal{D})\leqslant 0{,}385. L'estimation 0,3310{,}331 tombe dans l'encadrement, ce qui la rend crédible ; la valeur exacte, 13\frac{1}{3}, se démontre en Terminale avec le calcul intégral. Les deux listes en compréhension font en une ligne ce que la méthode d'Archimède faisait à la main.

d)

Les points sont maintenant tirés dans le carré [−1 ;1]×[−1 ;1][-1\,;1]\times[-1\,;1], d'aire 44, et la condition décrit le disque de centre OO et de rayon 11, d'aire π×12=π\pi\times 1^{2}=\pi. La proportion de points comptés approche donc π4\frac{\pi}{4}, et l'estimation de π\pi vaut quatre fois cette proportion : 4×15 70220 000=4×0,785 1=3,140 44\times\frac{15\,702}{20\,000}=4\times 0{,}785\,1=3{,}140\,4. Oublier le facteur 44, c'est confondre la proportion avec l'aire : la proportion est un rapport d'aires, et l'aire du carré n'est plus 11.

e)

L'erreur typique d'une fréquence se comporte comme 1n\frac{1}{\sqrt{n}}, comme la demi-largeur 2σn\frac{2\sigma}{\sqrt{n}} de l'exercice 15 : pour la diviser par 22, il faut multiplier n\sqrt{n} par 22, donc nn par 44. Monte-Carlo est simple à programmer mais lent : une décimale de plus coûte cent fois plus de points.

Une aire devient une probabilité, une probabilité se lit comme une fréquence, et la fréquence se vérifie par un encadrement déterministe : le hasard donne l'estimation, la liste des rectangles dit si elle est plausible.

Exercice 21 : Fréquence d'apparition des lettres d'un texte

On veut compter les lettres d'un texte écrit en minuscules, sans accents, à l'aide d'une liste de 2626 compteurs, un par lettre de l'alphabet. Dans de longs textes, la lettre e représente environ 15 %15\ \% des lettres en français et 13 %13\ \% en anglais, la lettre h environ 1 %1\ \% en français et 6 %6\ \% en anglais.

alphabet = "abcdefghijklmnopqrstuvwxyz"
texte = "les mathematiques se lisent aussi dans les lettres"
compte = [0 for k in range(26)]
for c in texte:
    if c in alphabet:
        i = alphabet.index(c)
        compte[i] = compte[i] + 1
n = sum(compte)
freq = [round(100*x/n, 1) for x in compte]
  • a) Que contient la liste compte au départ ? Quelle lettre l'élément compte[4] compte-t-il, et que vaut-il à la fin ?
  • b) Que vaut n ? Et len(texte) ? Pourquoi ces deux nombres diffèrent-ils, et lequel faut-il utiliser pour une fréquence ?
  • c) Que vaut freq[4] ? Quelle lettre l'instruction alphabet[compte.index(max(compte))] renvoie-t-elle ?
  • d) On lance le même programme sur le texte anglais « the theory of numbers is the queen of mathematics ». Il compte 4141 lettres, dont 44 h. Donnez la fréquence de h dans chacun des deux textes, en pourcentage au dixième.
  • e) Laquelle des lettres e et h distingue le mieux un texte français d'un texte anglais ? Et que penser d'une conclusion tirée d'un texte de quarante lettres ?

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

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

Réponses

  • a) 2626 zéros ; compte[4] compte e et vaut 88
  • b) n =43=43 lettres, len(texte) =50=50 caractères dont 77 espaces ; on divise par n
  • c) freq[4] ≈18,6\approx 18{,}6 ; la lettre renvoyée est s (99 occurrences)
  • d) h : 441≈9,8 %\frac{4}{41}\approx 9{,}8\ \% en anglais, 143≈2,3 %\frac{1}{43}\approx 2{,}3\ \% en français
  • e) h distingue les langues ; sur quarante lettres la conclusion reste fragile
a)

Au départ, compte est la liste de 2626 zéros construite en compréhension, un compteur par lettre. La boucle ITÈRE sur les caractères du texte ; pour chaque lettre, alphabet.index(c) donne sa position dans l'alphabet, À PARTIR DE 00 : a est à l'indice 00, b à l'indice 11, et l'indice 44 est celui de e, la cinquième lettre. Le texte contient les e de « les » (deux fois), « mathematiques » (deux), « se », « lisent » et « lettres » (deux) : compte[4] vaut 88 à la fin. Croire que compte[4] compte d, la quatrième lettre, c'est l'erreur d'indice de l'exercice 16.

b)

n est la somme des compteurs, c'est-à-dire le nombre de LETTRES : 4343. len(texte) compte tous les caractères, espaces compris : 5050. La différence, 77, est le nombre d'espaces entre les huit mots ; le test if c in alphabet les écarte. Une fréquence de lettre se calcule sur les lettres : diviser par 5050 donnerait pour e 850=16 %\frac{8}{50}=16\ \% au lieu de 18,6 %18{,}6\ \%.

c)

freq[4] =100×843≈18,6=\frac{100\times 8}{43}\approx 18{,}6. L'instruction cherche le maximum de la liste compte, puis l'INDICE de ce maximum, puis la lettre de même indice dans alphabet. Or le texte contient 99 s pour 88 e : elle renvoie s, pas e. Sur ce court texte, la lettre la plus fréquente du français n'est même pas en tête, les pluriels ayant multiplié les s.

d)

Dans le texte anglais, h apparaît dans « the » (deux fois), « theory » et « mathematics » : 441≈9,8 %\frac{4}{41}\approx 9{,}8\ \%. Dans le texte français, un seul h, celui de « mathematiques » : 143≈2,3 %\frac{1}{43}\approx 2{,}3\ \%. Les deux fréquences de e, elles, sont voisines : 843≈18,6 %\frac{8}{43}\approx 18{,}6\ \% en français et 741≈17,1 %\frac{7}{41}\approx 17{,}1\ \% en anglais.

e)

C'est h qui distingue les deux langues : de l'ordre de 1 %1\ \% contre 6 %6\ \% sur de longs textes, un rapport de un à six, alors que e passe seulement de 15 %15\ \% à 13 %13\ \%. On compare donc la lettre dont les fréquences de référence s'écartent le plus, pas la plus fréquente. Mais sur une quarantaine de lettres la fréquence fluctue beaucoup, comme le montre le s de la question c) : la conclusion n'est fiable que sur un texte long. C'est le lien avec les variables aléatoires : la fréquence observée approche la probabilité quand le nombre de lettres grandit.

La liste de 2626 compteurs est la version programmée d'un tableau d'effectifs : l'indice désigne la lettre, la valeur son effectif, et une fréquence se calcule sur l'effectif total, jamais sur la longueur du texte brut.

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.

De quoi s'agit-il ?
Je lis chaque demande moi-même, personne d'autre ne la voit. Inutile d'écrire ton nom ou celui de ton école.
Quand ta demande est traitée, tu es prévenu par courriel et dans ton espace.

En envoyant, tu acceptes que je lise ta demande pour y répondre. Elle est gardée avec ton compte, effacée avec lui, et jamais publiée : politique de confidentialité.

Chapitre précédent Les variables aléatoires

Ce chapitre resservira dans

Les chapitres qui le réclament en amont, plus tard dans l'année ou dans les années suivantes.

© Ahmed Squalli Houssaini. Série publiée sur www.letuteurscientifique.ca/exercices/1spe-python-sciences. Libre pour l'usage personnel et en classe ; sa republication ailleurs demande une autorisation écrite (mentions légales).

Voir aussi

Vous cherchez un tuteur de spécialité maths en Première à 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