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 , l’unique zéro dans de
Ce est , à ceci près que 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 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 radians, soit : l’itération convergerait alors sans le moindre message d’erreur, vers une valeur plausible et fausse. La bonne écriture estmath.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 , écrire 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 , 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 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 tronqué, pas vers .
Le compte des décimales stabilisées demandé en Q6, mesuré exactement :
| erreur | décimales exactes | gain | ||
|---|---|---|---|---|
| 0 | ||||
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 |
Exactement 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
Chaque tour multiplie l’erreur par ce nombre, donc lui gagne 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 étapes, le milieu approche à près, et l’on veut , soit . Comme ne suffit pas et suffit, il faut .
Le rythme est celui du cours, et il ne dépend d’aucune propriété de : chaque étape divise l’erreur par , donc gagne décimale. Autrement dit é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 avec et de signes contraires, la corde joint à et rencontre l’axe des abscisses en
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à , soit trois décimales exactes en une seule opération, comme l’annonçait la question Q19b. Le rythme mesuré :
| erreur | décimales exactes | gain | ||
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 | ||||
| 5 |
Exactement décimales par tour, et là encore la théorie l’explique. Dans cette configuration, la borne ne bouge jamais : seule descend vers . L’erreur est donc multipliée à chaque tour par le facteur
ce qui donne décimales par tour. La figure du DM disait déjà pourquoi : sur , 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 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 : contre .
- La machine d’al-Kashi atteint pourtant les dix décimales la première. Regardez les deux tableaux : est à décimales après deux tours, alors que n’atteint 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 : , 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 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, : 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 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 par rapport à , on obtient
c’est-à-dire qu’une erreur sur se transmet à en étant divisée par trois environ. Vérification : l’écart mesuré entre la limite de la machine et vaut , et l’erreur de troncature sur est de l’ordre de . Le rapport est bien voisin de .
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 qu’on lui a donné. Si l’on veut plus de décimales de , il faut d’abord plus de décimales de , 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 é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).