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