Terminale · F1
terminale
Aller plus loin · Scripts

Les scripts complets du tournoi des méthodes

Les trois concurrentes du DM lancées sur la même équation, sorties réelles à l'appui : 2,91 décimales par tour pour la machine d'al-Kashi, 3,09 pour la fausse position, 0,301 pour la dichotomie. Le podium, et pourquoi il se joue au départ.

Le DM Le sinus du degré organise en partie V un tournoi entre trois façons d’attraper la même racine. Voici les scripts complets, exécutés, avec leurs sorties réelles et la mesure exacte de ce que chacune gagne par tour.

Rappel du cadre. On cherche xx^{*}, l’unique zéro dans [0;0,06][0\,;0{,}06] de

f(x)=4x33x+q,q=sin30,0523359562.f(x) = 4x^3 - 3x + q, \qquad q = \sin 3^\circ \approx 0{,}0523359562.

Ce xx^{*} est sin1\sin 1^\circ, à ceci près que qq est donné tronqué : la question Q17 du DM mesure précisément l’écart que cette troncature provoque, et nous y reviendrons au dernier paragraphe.

Le piège à ne pas manquer. La valeur de qq est écrite en dur dans tous les scripts, c’est voulu. Toute la trigonométrie du devoir tient dans cette constante. Si vous êtes tenté d’écrire math.sin(3), sachez que Python calcule le sinus de 33 radians, soit 0,14110{,}1411\ldots : l’itération convergerait alors sans le moindre message d’erreur, vers une valeur plausible et fausse. La bonne écriture est math.sin(math.radians(3)).

1. La machine d’al-Kashi (partie II)

Le coup de génie tient dans un changement d’écriture : au lieu de 3x4x3=q3x - 4x^3 = q, écrire x=q+4x33x = \frac{q + 4x^3}{3} et lire cette égalité comme une machine.

q = 0.0523359562        # sin(3 degres), donnee de Samarcande (R2)

def g(x):
    return (q + 4 * x**3) / 3

u = q / 3               # le point de depart de la question Q6
for n in range(8):
    print(n, u)
    u = g(u)

Sortie :

0 0.017445318733333333
1 0.017452397791199867
2 0.017452406412434986
3 0.01745240642293863
4 0.017452406422951424
5 0.017452406422951438
6 0.017452406422951438
7 0.017452406422951438

L’affichage se fige à partir de n=5n = 5, et le DM prévenait que ce gel resterait mystérieux jusqu’à la question Q17. La raison est double, et il faut les distinguer : à partir de n=5n = 5 la suite a atteint la précision des flottants de la machine, et de toute façon elle converge vers le point fixe de l’équation avec qq tronqué, pas vers sin1\sin 1^\circ.

Le compte des décimales stabilisées demandé en Q6, mesuré exactement :

nnunu_nerreurdécimales exactesgain
00,0174453187330{,}0174453187337,1×1067{,}1 \times 10^{-6}5,155{,}15
10,0174523977910{,}0174523977918,6×1098{,}6 \times 10^{-9}8,068{,}06+2,91+2{,}91
20,0174524064120{,}0174524064121,1×10111{,}1 \times 10^{-11}10,9810{,}98+2,91+2{,}91
30,0174524064230{,}0174524064231,3×10141{,}3 \times 10^{-14}13,8913{,}89+2,91+2{,}91
40,0174524064230{,}0174524064231,6×10171{,}6 \times 10^{-17}16,8116{,}81+2,91+2{,}91

Exactement 2,912{,}91 décimales par tour, avec une régularité de métronome. Le DM en donne la raison en partie III : la machine est une contraction, et son facteur local au point fixe vaut

g(x)=4(x)2=4sin211,2183×103.g'(x^{*}) = 4 (x^{*})^{2} = 4\sin^2 1^\circ \approx 1{,}2183 \times 10^{-3}.

Chaque tour multiplie l’erreur par ce nombre, donc lui gagne log10(1,2183×103)=2,914-\log_{10}\left(1{,}2183 \times 10^{-3}\right) = 2{,}914 décimales. La théorie et la mesure coïncident à la deuxième décimale près.

2. La dichotomie, valeur sûre (question Q18)

q = 0.0523359562

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

a, b = 0.0, 0.06
n = 0
while b - a > 1e-10:
    m = (a + b) / 2
    if f(a) * f(m) <= 0:
        b = m
    else:
        a = m
    n += 1
print(n, (a + b) / 2)

Sortie :

30 0.017452406426891685

Trente étapes. Le calcul exact de la question Q18b le prévoyait : après nn étapes, le milieu approche xx^{*} à 0,062n+1\frac{0{,}06}{2^{\,n+1}} près, et l’on veut 0,062n+10,5×1010\frac{0{,}06}{2^{\,n+1}} \leqslant 0{,}5 \times 10^{-10}, soit 2n+11,2×1092^{\,n+1} \geqslant 1{,}2 \times 10^{9}. Comme 2301,07×1092^{30} \approx 1{,}07 \times 10^{9} ne suffit pas et 2312,15×1092^{31} \approx 2{,}15 \times 10^{9} suffit, il faut n=30n = 30.

Le rythme est celui du cours, et il ne dépend d’aucune propriété de ff : chaque étape divise l’erreur par 22, donc gagne log10(2)=0,301\log_{10}(2) = 0{,}301 décimale. Autrement dit 3,323{,}32 étapes par décimale, et jamais mieux.

3. La fausse position (question Q19)

Au lieu de couper au milieu, on coupe là où la corde traverse l’axe. Sur [a;b][a\,;b] avec f(a)f(a) et f(b)f(b) de signes contraires, la corde joint (a;f(a))(a\,;f(a)) à (b;f(b))(b\,;f(b)) et rencontre l’axe des abscisses en

c=af(a)baf(b)f(a).c = a - f(a)\,\frac{b - a}{f(b) - f(a)}.

q = 0.0523359562

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

a, b = 0.0, 0.06
for n in range(1, 6):
    c = a - f(a) * (b - a) / (f(b) - f(a))
    print(n, c)
    if f(a) * f(c) <= 0:
        b = c
    else:
        a = c

Sortie :

1 0.017529460142015008
2 0.017452469172211597
3 0.01745240647393911
4 0.017452406422992874
5 0.017452406422951473

La première corde donne déjà c10,0175294601c_1 \approx 0{,}0175294601, soit trois décimales exactes en une seule opération, comme l’annonçait la question Q19b. Le rythme mesuré :

nncnc_nerreurdécimales exactesgain
10,0175294601420{,}0175294601427,7×1057{,}7 \times 10^{-5}4,114{,}11
20,0174524691720{,}0174524691726,3×1086{,}3 \times 10^{-8}7,207{,}20+3,09+3{,}09
30,0174524064740{,}0174524064745,1×10115{,}1 \times 10^{-11}10,2910{,}29+3,09+3{,}09
40,0174524064230{,}0174524064234,1×10144{,}1 \times 10^{-14}13,3813{,}38+3,09+3{,}09
50,0174524064230{,}0174524064233,4×10173{,}4 \times 10^{-17}16,4716{,}47+3,09+3{,}09

Exactement 3,093{,}09 décimales par tour, et là encore la théorie l’explique. Dans cette configuration, la borne a=0a = 0 ne bouge jamais : seule bb descend vers xx^{*}. L’erreur est donc multipliée à chaque tour par le facteur

1f(x)axf(a)f(x)8,2×104,\left| 1 - f'(x^{*})\,\frac{a - x^{*}}{f(a) - f(x^{*})} \right| \approx 8{,}2 \times 10^{-4},

ce qui donne log10(8,2×104)=3,09-\log_{10}\left(8{,}2 \times 10^{-4}\right) = 3{,}09 décimales par tour. La figure du DM disait déjà pourquoi : sur [0;0,06][0\,;0{,}06], la cubique est si peu courbée que la corde s’en distingue à peine.

4. Le podium, et le récit honnête

print("methode                decimales gagnees par tour")
print("dichotomie             0.301")
print("machine d'al-Kashi     2.91")
print("fausse position        3.09")

Le tournoi n’oppose pas une lente à une rapide : il oppose une méthode lente à deux méthodes rapides, qui gagnent toutes les deux environ trois décimales par tour. C’est le récit exact, et il faut y insister car la tentation est grande de raconter un duel.

  • La dichotomie perd de dix ordres de grandeur en rythme. Sa vertu est ailleurs, et elle est immense : elle garantit son erreur à chaque étape, sans aucune hypothèse sur ff au-delà de la continuité et du changement de signe.
  • La fausse position est la plus rapide en rythme de croisière, d’un cheveu : 3,093{,}09 contre 2,912{,}91.
  • La machine d’al-Kashi atteint pourtant les dix décimales la première. Regardez les deux tableaux : u2u_2 est à 10,9810{,}98 décimales après deux tours, alors que c3c_3 n’atteint 10,2910{,}29 qu’au troisième. L’avance ne vient donc pas de la vitesse de croisière, elle vient du point de départ. La question Q7 du DM l’avait démontré avant même de tourner : u0x105\left|u_0 - x^{*}\right| \leqslant 10^{-5}, la machine connaît déjà cinq décimales avant son premier tour, quand la fausse position part de rien.

Et la question Q20b, qui est la vraie question du DM. Pourquoi al-Kashi, à Samarcande, en base soixante, à la main, a-t-il choisi la machine plutôt que la corde, alors que la corde va très légèrement plus vite ?

Parce que la machine n’a rien à surveiller. La dichotomie et la fausse position exigent de maintenir un encadrement, d’évaluer ff en deux points, de comparer des signes et de choisir un côté à chaque tour : autant d’occasions de se tromper quand on calcule à la plume sur des tables sexagésimales. La machine, elle, itère une formule unique, sans aucun test. Mieux encore, et c’est décisif : ses chiffres, une fois posés, ne bougent plus. Al-Kashi ne recalculait pas tout à chaque tour, il déterminait la place suivante et l’écrivait. Une méthode qui écrit ses chiffres définitivement bat, pour un calculateur humain, une méthode marginalement plus rapide qui les réécrit tous.

C’est un critère qui a disparu de nos préoccupations, et qui gouvernait les leurs.

5. La cellule de vérification (question Q17d)

Seule apparition de la trigonométrie machine dans tout le devoir, et elle est en radians.

import math
print(math.sin(math.radians(1)))

Sortie :

0.01745240643728351

Comparez avec la limite de la machine, 0,0174524064229510{,}017452406422951\ldots : les deux valeurs divergent à la onzième décimale. Ce n’est ni une erreur de la machine, ni une erreur de Python. C’est la question Q17 : la donnée qq a été tronquée à dix décimales, et cette troncature se propage jusqu’au résultat.

Le DM en donne le coefficient exact. En dérivant l’équation h(x)=qh(x^{*}) = q par rapport à qq, on obtient

dxdq=1312sin210,3337,\frac{\mathrm{d}x^{*}}{\mathrm{d}q} = \frac{1}{3 - 12\sin^2 1^\circ} \approx 0{,}3337,

c’est-à-dire qu’une erreur sur qq se transmet à xx^{*} en étant divisée par trois environ. Vérification : l’écart mesuré entre la limite de la machine et sin1\sin 1^\circ vaut 1,43×10111{,}43 \times 10^{-11}, et l’erreur de troncature sur qq est de l’ordre de 4,3×10114{,}3 \times 10^{-11}. Le rapport est bien voisin de 13\frac13.

La conclusion vaut pour tout le chapitre. Aucun algorithme, si rapide soit-il, ne peut être plus précis que sa donnée d’entrée. La machine d’al-Kashi n’a pas fait d’erreur : elle a résolu exactement le problème qu’on lui a posé, avec le qq qu’on lui a donné. Si l’on veut plus de décimales de sin1\sin 1^\circ, il faut d’abord plus de décimales de sin3\sin 3^\circ, et c’est précisément l’objet de la partie VI du devoir, qui va les chercher sous forme exacte, par radicaux.

Sources

  • DM1 F1, Le sinus du degré, parties II, III et V, et annexe B.
  • Cours F1, § 6.1 pour la dichotomie et sa loi des 3,323{,}32 étapes par décimale.
  • Tous les scripts de cette page ont été exécutés ; les sorties sont recopiées telles quelles. Les erreurs, décimales exactes et taux de convergence ont été recalculés en précision arbitraire (50 chiffres de travail).
← Retour au chapitre F1