![]() ![]() version JavaScript » version tableur |
On attribue à Héron la formule récurrente d'approximation de la racine carrée d'un nombre N :
On peut se convaincre facilement du bien fondé de l'algorithme :
• Soit r1 une approximation par
défaut de
√N
; r'1 = N/r1 en est alors une
approximation par excès.
• On choisit alors leur moyenne
arithmétique r2 comme nouvelle valeur
approchée de √N
.
• En poursuivant de même, en calculant
r'2 = N/r2 puis r3, on
obtient des approximations de plus en plus fines de
√N
.
Il est clair que le choix d'un approximation r1 par excès peut aussi être envisagé. Si r1 est très éloigné de √N, la formule rétablit immédiatement l'équilibre! Cette technique, très efficace, conduit à √2 = 1,414213562 (9 décimales exactes) en quatre itérations.
Étude théorique et programme de calcul : |
Considérons un nombre positif N dont on veut calculer la racine carrée et la suite (rn) de réels positifs définie par la récurrence (r) :
Pour tout n ≥ 0, on vérifiera aisément :
• (rn+1)2 - N =
(rn - N/ rn)2/4
>
0, donc N - rn2 < 0
dès n ≥ 1,
• 2(rn+1
- rn) = (N - rn2)/rn
< 0
La suite (rn) apparaît ainsi comme décroissante et minorée par √N . Elle est donc convergente et sa limite L (positive) vérifie
L = (L + N/L)/2
Ce qui conduit à L = √N.
Programmation de la méthode en JavaScript |
La rapidité de convergence est tout à fait impressionnante. Si r est la valeur approchée (r > √N) obtenue par le programme, et ε l'erreur absolue, en vertu de la formule :
et en négligeant le terme ε2, l'erreur sur la racine carrée sera dans le programme : ε = (r2 - N)/(2r).
On pourra vérifier l'égalité :
Par conséquent, rn - √N tend vers 0 comme :
La présence de ce 2n explique la rapidité de convergence.
<SCRIPT LANGUAGE=JavaScript>
function go()
{
n=""
n=eval(prompt("Votre nombre :",n))
r=""
r=eval(prompt("racine carrée initiale :",r)) // on laisse à l'utilisateur le soin de chosir ro
co=0;
while (1)
{co++;
r = (r+n/r)/2;r2 = r*r;
if (!confirm("itération "+co+", OK pour continuer"+"\n"+"r="+r+"\n"+"erreur="+(r*r-n)/2/r
+"\n"+"contrôle r*r="+r2)) return
}
}
</SCRIPT>
Programme équivalent sur tableur : »