Héron d’Alexandrie est un ingénieur, un mécanicien et un
mathématicien grec du premier siècle après J.-C.
On ne sait pas grand chose de la vie d’Héron, si ce n’est qu’il était
originaire d’Alexandrie ; les historiens se sont même longtemps
divisés sur l’époque où il a vécu. Leurs estimations allaient
du 1er siècle avant J.-C. au 3ème siècle de
notre ère. Aujourd’hui, la querelle est éteinte : il est clairement
établi que Héron est postérieur à Vitruve mort en $- 20$, et
contemporain de Pline l’Ancien (23 – 79), en étant actif autour de l’an
62. Il a donc bien vécu au 1er siècle après J.-C. et sans
doute au début du 2ème siècle, donc sous l’Empire romain,
mais dans l’Alexandrie grecque.
On attribue à Héron d’Alexandrie plusieurs formules mathématiques
et une méthode efficace d’extraction de racine carrée,
c’est-à-dire de résolution de l’équation $x^2 = a$, avec $a$
positif :
Choisir une première valeur raisonnable que l’on note $G$.
Améliorer cette valeur en calculant la moyenne des valeurs $G$ et $x/G$.
Vérifier si cette nouvelle valeur convient.
Reprendre l’étape 2 tant que la valeur calculée n’est pas satisfaisante.
L’objectif de cette activité est de mettre en œuvre cette méthode en Python.
Travail à réaliser
Le fichier réponse devra se terminer par les instructions afin de pouvoir y placer les jeux de tests pour les différentes fonctions (on découvrira la signification de cette instruction dans quelques jours).
1
if__name__=="__main__":
Qu’appelle-t-on la documentation d’une fonction ? La spécification d’une fonction ?
Toute fonction doit être accompagnée de sa spécification !
Définir la fonction moyenne dont la spécification est
1
2
3
4
defmoyenne(a:float,b:float)->float:""" Calcule et retourne la moyenne des deux nombres a et b
passés en argument.
"""
Ajouter le jeu de test suivant à la fin du fichier :
1
2
assertmoyenne(12,16)==14assertmoyenne(0,8)==4
Réponse
1
2
3
4
5
6
defmoyenne(a:float,b:float)->float:"""
Calcule et retourne la moyenne des deux nombres a et b
passés en argument.
"""return(a+b)/2
Définir la fonction valeur_absolue dont la spécification est :
1
2
3
4
defvaleur_absolue(x:float)->float:"""
Calcule et retourne la valeur absolue du nombre x passé en argument.
"""
Remarque.
Il est interdit d’utiliser la fonction abs intégrée à Python.
Ajouter le jeu de test suivant à la fin du fichier :
defpuissance(x:float,n:int)->float:"""
calcule et retourne le résultat de x à la puissance entière n :
x^n = x . x . x . ... . x (n fois)
"""res=1foriinrange(1,n+1):res*=xreturnres
Définir la fonction amelioration_essai dont la spécification est :
1
2
3
4
defamelioration_essai(essai:float,x:float)->float:""" Calcule et retourne la moyenne des nombres essai (strictement positif)
et x/essai.
"""
Remarque.
Cette fonction doit utiliser la fonction moyenne définie plus haut.
Ajouter le jeu de test suivant à la fin du fichier :
defamelioration_essai(essai:float,x:float)->float:"""
Calcule et retourne la moyenne des nombres essai (strictement positif) et x/essai.
"""returnmoyenne(essai,x/essai)
Définir le prédicat est_suffisamment_bon dont la spécification est :
1
2
3
4
5
6
defest_suffisamment_bon(essai:float,x:float)->bool:"""
Retourne True si la valeur absolue de la différence du carré du nombre essai
et du nombre x est inférieure à une tolérance donnée (prendre 0.001).
Retourne False sinon.
"""
Remarque.
Cette fonction doit utiliser les fonctions valeur_absolue et puissance définies ci-dessus.
Ajouter le jeu de test suivant à la fin du fichier :
defest_suffisamment_bon(essai:float,x:float)->bool:"""
Retourne True si la valeur absolue de la différence du carré du nombre essai
et du nombre x est inférieure à une tolérance donnée (prendre 0.001).
Retourne False sinon.
"""tolerance=0.001returnvaleur_absolue(puissance(essai,2)-x)<tolerance
Définir la fonction test qui implémente l’algorithme de Héron d’Alexandrie. La spécification de la fonction est :
1
2
3
4
5
deftest(essai:float,x:float)->float:"""
Retourne la racine carrée du nombre x. Le calcul est effectué grâce à un
raisonnement itératif depuis une première valeur strictement positive notée essai.
"""
Remarque.
Cette fonction doit utiliser les fonctions est_suffisamment_bon et amelioration_essai.
Ajouter le jeu de test suivant à la fin du fichier :
deftest(essai:float,x:float)->float:"""
Retourne la racine carrée du nombre x. Le calcul est effectué grâce à un
raisonnement itératif depuis une première valeur strictement positive notée
essai.
"""whilenotest_suffisamment_bon(essai,x):essai=amelioration_essai(essai,x)returnessai
Définir la fonction racine_carree dont la spécification est :
1
2
3
4
5
defracine_carree(x:float)->float:"""
Retourne le résultat de l'appel de la fonction test avec la valeur 1
pour l'argument essai.
"""
Ajouter le jeu de test suivant à la fin du fichier :