Héron, et ronds, petits patapons

lundi 13 septembre 2010
par  Alain BUSSER

Belle histoire que celle de l’algorithme de Héron pour calculer des racines carrées : Cas particulier de la méthode de Newton, l’algorithme était sans doute déjà connu des Babyloniens (au moins dans le cas de la racine de 2).

On peut en parler en Seconde. Mais en Première, le langage des suites permet de mieux situer la problématique, et l’algorithme de Héron illustre la notion de convergence des suites, tout en plaçant la notion dans un contexte motivant. Et en bonus, on parle de boucles à condition de sortie...

(photo prise par Marek_Szczepanek sous license CC)

L’algorithme de Héron est utilisé dans les calculatrices, et vraisemblablement aussi dans les ordinateurs, pour calculer les racines carrées. On est donc dans du concret ! Ceci dit, c’est bien joli de sortir de son chapeau une suite qui converge vers \sqrt{5}, et qui est définie par w_{n+1}=\frac{w_n+\frac{5}{w_n}}{2}, pour calculer une valeur approchée de \sqrt{5} en calculant par exemple w_{20}... C’est tout de même mieux de donner un indice, à défaut d’une démonstration, du fait que la suite est convergente, et que sa limite est bien \sqrt{5}.

Pour le deuxième point, on peut (sans parler de continuité) faire résoudre l’équation x=\frac{x+\frac{5}{x}}{2}. Pour la convergence c’est moins facile (à moins d’utiliser le théorème des accroissements finis...). Pour expliquer de quel chapeau le lapin est sorti, avec deux suites u_n et v_n telles que u_{n+1}=\frac{u_n+v_n}{2} et v_{n+1}=\frac{5}{u_{n+1}} (qui, hélas, ne sont pas adjacentes parce que pas monotones), on peut partir de l’idée que

  • x\simeq \sqrt{5} \Rightarrow \frac{5}{x}\simeq \sqrt{5}
  • Si l’une des deux valeurs approchées est par défaut, l’autre l’est par excès et vice-versa.
  • À partir de deux valeurs approchées de \sqrt{5} telles que x\leqslant \sqrt{5} \leqslant y, on en construit facilement une meilleure en prenant leur moyenne arithmétique (idée conçue spontanément par plusieurs élèves qui trouvent ça naturel).

On peut envisager de pousser un peu plus loin cette idée en utilisant le caractère multi-agents du logiciel Scratch, et en confiant le calcul de u_n à un lutin (ci-dessous appelé moyenneur puisqu’il calcule une moyenne arithmétique) et le calcul de v_n à un autre lutin (ci-dessous appelé inverseur puisque pour diviser 5 par u_{n+1}, on le multiplie par son inverse). Les deux lutins doivent être synchronisés par un « maître », lequel sera incarné par la « scène » de Scratch :

Comme on le voit, son rôle se borne à incarner la boucle. Pour le traitement effectué dans la boucle, il est partagé entre les deux lutins. Le moyenneur calcule des moyennes, quand on (la scène) le lui demande :

Et l’inverseur calcule juste des quotients :

Certes, en simulant du calcul parallèle, on s’éloigne un tantinet de l’algorithmique, mais cette description permet de montrer le fonctionnement de l’algorithme sans avoir à parler de suite. Voici ce que donne l’exécution du script (le moyenneur à gauche, avec deux pinces parce qu’il opère sur deux nombres, et donc l’inverseur à droite, à l’envers comme tout inverseur qui se respecte) :

De même, le traitement simultané des deux suites peut être fait par un logiciel de géométrie dynamique, en représentant simultanément les deux suites par un point (de coordonnées (u_n;v_n)) et en appliquant une dizaine de fois une macro (la convergence est suffisamment rapide pour cela). Voici la version CaRMetal :

CarMetal - 5 ko

En manipulant la figure ci-dessus, on constate que l’algorithme converge vers l’une ou l’autre des deux limites possibles, selon la valeur initiale. On peut parler de bassin d’attraction.

Ceci dit, la suite w_n ci-dessus se prête à une figure dynamique, en remplaçant 5 par un curseur R :

CarMetal - 3.8 ko

Le CaRScript ayant permis cette construction est sans doute « non exigible » :

u=Point("U0",0,1);
SetFixed(u,true);
for(var n=1;n<21;n++){
    u=Point("U"+n,n,"(y(U"+(n-1)+")+R/y(U"+(n-1)+"))/2");
}

Remarque :

La version « toile d’araignée » n’est pas très pertinente dans le cas présent, la suite converge trop vite pour qu’on ait le temps d’y voir quelque chose...

Avec les exétrons de Python

On peut très bien laisser un exétron (ou thread (informatique)) faire le calcul de la moyenne, et, en même temps (ou presque si on veut la bonne limite), un autre exétron faire la division. On a donc besoin des deux modules threading et time de Python :

from threading import *
import time
r, s = 1.0, 0.0

On en a profité au passage pour initialiser les variables r et s à des valeurs réelles. Pour décrire le fonctionnement du moyenneur, on définit une classe (informatique) héritant de la classe Thread (le moyenneur est un exétron) munie d’une méthode __init__ (création) et d’une méthode run (démarrage). Cette méthode consiste à calculer 8 fois la moyenne de r et s et mettre le résultat dans r (qui doit donc être déclaré comme global) :

class Moyenneur(Thread):
    def __init__(self):
        Thread.__init__(self)
        print "Maintenant on a un moyenneur"
    def run(self):
      global r
      for n in range(8):
          r += s
          r /= 2
          print "Moyenne : ", r
          time.sleep(2)

Après chaque calcul de moyenne, l’exétron entre en hibernation pour laisser à l’inverseur le temps de modifier s : L’inverseur est aussi un exétron qui, après une petite pause (le temps de laisser le moyenneur finir son travail), remplace s par 5/r :

class Inverseur(Thread):
    def __init__(self):
        Thread.__init__(self)
        print "Maintenant on a un inverseur"
    def run(self):
        global s
        for n in range(8):
          time.sleep(1)
          s = 5.0/r
          print "Division : ", s
          time.sleep(1)

Après avoir effectué la division, l’inverseur attend une seconde pour boucler ; ainsi la durée totale d’un passage dans la boucle pour l’inverseur est de 2 secondes, et l’inverseur reste synchrone avec le moyenneur. Pour calculer la racine de 5, il suffit maintenant de

  • créer deux exétrons, l’un de type moyenneur et l’autre de type inverseur ;
  • démarrer les deux exétrons ;
  • regarder ce que ça donne.

Voici le script complet, affiché en couleurs et téléchargeable :

from threading import *
import time
r, s = 1.0, 0.0
class Moyenneur(Thread):
    def __init__(self):
        Thread.__init__(self)
        print "Maintenant on a un moyenneur"
    def run(self):
      global r
      for n in range(8):
          r += s
          r /= 2
          print "Moyenne : ", r
          time.sleep(2)
               
class Inverseur(Thread):
    def __init__(self):
        Thread.__init__(self)
        print "Maintenant on a un inverseur"
    def run(self):
        global s
        for n in range(8):
          time.sleep(1)
          s = 5.0/r
          print "Division : ", s
          time.sleep(1)
               
moyenneur = Moyenneur()
inverseur = Inverseur()
moyenneur.start()
inverseur.start()

Il est intéressant de modifier certaines durées et regarder ce que ça donne (et en particulier, pourquoi la mauvaise limite est calculée).


Commentaires

Logo de BILLE
mardi 21 octobre 2014 à 16h57 - par  BILLE

Bonjour,

Voici l’algorithme de calcul de Heron en LOGO entièrement conçu pour la syntaxe française (en couleurs dans l’éditeur du logiciel).
C’est plus lisible que l’organigramme de Scratch et en incitant les élèves à rédiger un texte de résolution, on les rapproche de l’écrit, ce qui est encore mieux. Qu’en pensez-vous ?
Cordialement,
Dominique Bille

/* Calcul de la racine carrée d’un nombre par la méthode de Heron d’Alexandrie :*/
efftxt
ecl [ taper un nombre dans la ligne des consignes : ]
effl
donne "s lisnombre effl
donne "n 10
donne « a :s donne »b 1
répète :n [
donne « a ( :a +:b ) / 2 donne »b :s / :a
ecl ph ph « :a= » :a ph « :b= » :b
]
ecl ph [ valeur moyenne : ] (:a + :b ) / 2

/*
Pour en savoir plus sur cette version du langage LOGO, visitez mon site
en cliquant sur l’adresse http://logoplus.pagesperso-orange.fr

*/

Annonces

Prochains rendez-vous de l’IREM

Séminaire EDIM-IREM

- Mercredi 3 mai 2017, 14h-18h, PTU, Saint-Denis, salle S23.6
- Mardi 13 juin 2017, 14h-18h, campus du Tampon
- Mercredi 14 juin 2017, 14h-18h, PTU, Saint-Denis, salle S23.6


Brèves

À travers les labyrinthes : algorithmes et fourmis

dimanche 1er septembre 2013

Quand les chercheurs mettent au point des modèles d’optimisation et de recherche de plus court chemin qui s’inspirent du comportement de masse de colonies de fourmis...
À écouter : Sur les Épaules de Darwin, émission diffusée sur France Inter samedi 31 août 2013.

Rencontres Mondiales du Logiciel Libre à St-Joseph

mardi 20 août 2013

Les RMLLd se dérouleront pour la 2e fois à Saint-Joseph du 22 au 25 août.
C’est une opportunité pour les élèves qui suivent la spécialité ISN et les passionnés d’informatique.

Voici pour le samedi et le dimanche quelques interventions choisies :
- http://2013.d.rmll.info/Raspberry-votre-ordinateur-au-format-carte-de-credit?lang=fr
- http://2013.d.rmll.info/Materiel-libre-et-DIY?lang=fr
- http://2013.d.rmll.info/Arduino-de-l-electronique-libre?lang=fr

Noter aussi les conférences Art et Culture du dimanche, ainsi qu’une conférence plus engagée.

Le programme complet se trouve ici. Une radio sera ouverte pour l’occasion.
Des plaquettes à distribuer se trouvent ici.

Hyper-vidéos pour l’algorithmique au lycée

dimanche 19 août 2012

Olivier Roizès, à la demande de l’ADIREM, a réalisé une collection d’hyper-vidéos de présentation de logiciels et environnements de programmation. Ces hyper-vidéos, c’est-à-dire des vidéos contenant des éléments clicables, devraient être utiles aux enseignants désireux de se familiariser avec Python, CaRMetal, R, Rurple, Scilab ou Xcas.

Ouverture du SILO

mardi 1er novembre 2011

Le SILO (Science Informatique au Lycée : Oui !) est un espace collaboratif documentaire de partage et de formation collégiale, à destination des professeurs appelés à enseigner l’informatique au lycée.

Une initiative du CNDP, de l’INRIA et de Pasc@line, à laquelle se sont associés SPECIF, fuscia, EPI et ePrep.

Sur le Web : Site du SILO

Introduction à la science informatique

lundi 12 septembre 2011

Le CRDP de Paris publie le premier ouvrage destiné aux professeurs chargés d’enseigner la nouvelle spécialité « Informatique et sciences du numérique » en Terminale S à la rentrée 2012. Cet ouvrage a été coordonné par Gilles Dowek, directeur de recherche à l’INRIA.

Sur la création de la spécialité ISN, on pourra également consulter l’interview donnée au Café pédagogique par l’inspecteur général Robert Cabanne.

Sur le Web : CRDP de Paris

Deux publications sur l’algorithmique

samedi 17 octobre 2009

L’IREM d’Aix-Marseille publie une brochure de 73 pages, téléchargeable librement, intitulée Algorithmes et logique au lycée. Ces notions sont illustrées et déclinées sur des exercices du programme de spécialité mathématique en série L, mais sont adaptables aux programmes à venir.

Le hors série thématique n° 37 du magazine Tangente, disponible actuellement en kiosque, s’intitule « Les algorithmes. Au cœur du raisonnement structuré ». Extrait de l’éditorial : « La rédaction de Tangente a conçu la quasi-totalité de ce hors série thématique pour qu’il puisse être lu par des élèves de Seconde ».

Une carte mentale pour l’algorithmique

jeudi 10 septembre 2009

Sur son site, Jean-Jacques Dhénin a publié une carte mentale géante qui renvoie vers plus de 30 documents en ligne sur l’algorithmique. Tout ce qu’il faut — et même davantage — pour faire face au nouveau programme de Seconde !

Un catalogue libre d’algorithmes pour le lycée

dimanche 30 août 2009

Guillaume Connan, de l’IREM de Nantes, publie un catalogue libre de 119 pages d’algorithmes pour le lycée. Sur son site très riche, on trouvera d’autres documents en rapport avec l’algorithmique, notamment sur l’utilisation des langages fonctionnels au lycée et sur la comparaison programmation fonctionnelle/programmation impérative.

L’algorithmique à l’IREM de Lille

vendredi 26 juin 2009

Le groupe AMECMI de l’IREM de Lille vient de mettre en ligne des ressources importantes au service des professeurs de Seconde :

- Algorithmique et programmation (Emmanuel Ostenne)
- Bibliographie amoureuse de l’algorithmique (Alain Juhel)

Statistiques

Dernière mise à jour

samedi 27 mai 2017

Publication

745 Articles
Aucun album photo
131 Brèves
11 Sites Web
127 Auteurs

Visites

163 aujourd'hui
593 hier
2024873 depuis le début
27 visiteurs actuellement connectés