ChronoMath, une chronologie des MATHÉMATIQUES
à l'usage des professeurs de mathématiques, des étudiants et des élèves des lycées & collèges

Approximation d'une racine carrée selon Héron d'Alexandrie
 
    version JavaScript        » version tableur

On attribue à Héron la formule récurrente d'approximation de la racine carrée d'un nombre N :

rn+1 = (rn + N/ rn)/2 , r1 donné.

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'= 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) :

ro > 0 et pour tout entier n ≥ 0 : rn+1 = (rn + N/rn)/2

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 :

N = (r - ε)2 = r2 - 2rε + ε2

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 :  »


© Serge Mehl - www.chronomath.com