La regula falsi en machine : le script, ligne à ligne
Une dizaine de lignes de Python, expliquées une par une, et la règle des deux erreurs tourne toute seule. Aucun prérequis : un interpréteur en ligne suffit. À vous de choisir ensuite la cible et le nombre de tours.
Voici la machine promise à la sortie du devoir. Elle ne fait aucune de vos questions à votre place : elle fait ce que la dernière d’entre elles vous demande de décrire, une fois que vous l’aurez décrit vous-même. Lisez-la après avoir rendu.
Aucune installation n’est nécessaire, et aucune connaissance de Python n’est supposée. Cherchez « python en ligne », collez, exécutez. Le mode Python de votre calculatrice fait aussi l’affaire.
D’abord, mettre la cible à zéro
Le devoir travaille avec une cible et une erreur . Les machines préfèrent une convention plus économe : on fait glisser la cible à zéro. Résoudre , c’est résoudre ; l’erreur d’un essai devient alors tout simplement la valeur de l’expression en , et il n’y a plus qu’un objet à manipuler au lieu de deux.
La fonction, ligne à ligne
def regula_falsi(f, a, b, n):
for k in range(n):
x = a - f(a) * (b - a) / (f(b) - f(a))
if f(a) * f(x) > 0:
a = x
else:
b = x
print("tour", k + 1, ":", x)
return x
Ligne 1. def déclare une recette et lui donne un nom. Elle attend quatre renseignements : l’expression f à annuler, les deux essais de départ a et b, et le nombre n de tours à effectuer.
Ligne 2. for k in range(n) répète tout ce qui est décalé en dessous, exactement n fois, avec k valant , puis , et ainsi de suite. C’est la boucle : c’est elle, et elle seule, qui transforme la règle des deux erreurs en méthode itérative.
Ligne 3. Le cœur. C’est la règle du devoir, sous la seconde écriture, celle qui part de l’essai a et le corrige d’une quantité proportionnelle à son erreur. Comparez caractère par caractère avec la formule de la partie V : c’est la même, la cible ayant glissé à zéro.
Lignes 4 à 7. Il faut décider lequel des deux essais la valeur x qui vient d’être calculée remplace. Un produit de deux nombres est positif exactement quand ils sont de même signe : si f(a) et f(x) sont de même signe, c’est que x est tombé du même côté de la solution que a, et il prend donc la place de a ; sinon il prend celle de b. Ainsi les deux essais encadrent toujours la solution, et la méthode ne peut pas la perdre de vue.
Ligne 8. print affiche le tour et la valeur, pour que vous puissiez regarder la suite se resserrer au lieu de recevoir un seul nombre.
Ligne 9. return rend la dernière valeur calculée.
L’exemple qui tourne
Approchons , c’est-à-dire annulons entre les essais et , en six tours.
def carre_moins_cinq(x):
return x * x - 5
regula_falsi(carre_moins_cinq, 2, 3, 6)
Sortie réelle, obtenue en exécutant ces lignes :
tour 1 : 2.2
tour 2 : 2.230769230769231
tour 3 : 2.235294117647059
tour 4 : 2.235955056179775
tour 5 : 2.236051502145923
tour 6 : 2.236065573770492
La valeur de référence est Trois choses se lisent sur cette colonne.
Les valeurs montent vers la cible et restent toutes en dessous : la corde passe au-dessus de la courbe des carrés, elle atteint donc la cible trop tôt. Le premier tour donne d’ailleurs une fraction que vous auriez pu écrire de tête, .
L’essai ne bouge jamais. À chaque tour, c’est l’autre borne qui est remplacée. La méthode s’appuie sans cesse sur le même point fixe, et c’est précisément ce qui la ralentit : elle gagne du terrain, mais elle traîne une jambe.
Le progrès ralentit : le premier tour gagne beaucoup, le sixième presque rien. Six tours pour cinq décimales seulement. La regula falsi est sûre plutôt que rapide, et la dernière section vous fera mesurer le prix de cette sûreté.
Un contrôle instructif
Reprenez le tout premier théorème du devoir, celui du premier degré, en résolvant à partir de deux essais aussi absurdes que et :
regula_falsi(lambda x: 3 * x - 4 - 11, 0, 10, 2)
tour 1 : 5.0
tour 2 : 5.0
Le premier tour tombe exactement sur la solution, et les suivants ne servent plus à rien. La boucle n’apporte quelque chose que là où la corde ment : au premier degré, elle ne ment pas, et le théorème que vous avez démontré s’affiche à l’écran.
À vous
Trois manettes, et toutes les trois valent le détour.
La cible. Remplacez le par un et lancez avec les essais et : la machine refera en une fraction de seconde les triangulations que vous avez menées à la main, et vous pourrez confronter ses premières lignes à vos fractions. Puis essayez , ou toute autre expression de votre choix, en veillant seulement à partir de deux essais qui encadrent la solution, c’est-à-dire dont les valeurs sont de signes contraires.
Le nombre de tours. Passez n à , puis à . La colonne se fige : à partir du dix-neuvième tour, l’affichage ne bouge plus d’un chiffre. La machine a atteint le mur de sa propre précision, celui qu’expliquait l’extra du chapitre A1 sur , et les quatre-vingt-un tours suivants ne servent à rien.
La stratégie. Remplacez le test de signe, c’est-à-dire les quatre lignes if et else, par la seule ligne a, b = b, x, qui garde simplement les deux derniers essais sans se demander où ils sont tombés. Vous obtenez la méthode de la sécante, et sur la même cible la colonne devient celle-ci :
tour 4 : 2.236067926333413
tour 5 : 2.2360679774992964
tour 6 : 2.23606797749979
Six tours pour toutes les décimales de la machine, là où l’encadrement en donnait cinq. Vous venez de payer la sûreté et d’en connaître le prix : c’est l’arbitrage que les bibliothèques de calcul scientifique tranchent encore aujourd’hui, et il se voit en une ligne de code.
Sources
- Devoir A3, parties IV, V et VI, dont aucune question n’est résolue ici.
- Toutes les sorties de cette page ont été exécutées sous Python 3.13, non recopiées.