====== Recherche par dichotomie ======
La méthode de **recherche par dichotomie** consiste à chercher une valeur dans une liste en réduisant progressivement la taille de la liste. //Dichotomie// signifie couper. On coupe la liste de recherche en deux ce qui la réduit très rapidement.
===== Exemple =====
On considère la fonction définie par $f(x) = -\frac{x^3}{4} + \frac{9\,x^2}{2} - 13\,x - 59$ dont on donne ci-dessous la représentation graphique sur l'intervalle $[0;10]$.
{{ ./dichotomie_fonction.png?nolink&400 |}}
Voici comment se passe la recherche :
* La zone de recherche initiale est $[0;10]$. On constate que $f(0) = -59$ et $f(10) = 11$. Il y a donc au moins une solution à $f(x) = 0$ avec $x\in[0;10]$.
* On cherche le milieu de $[0;10]$. C'est $5$. On calcule $f(5) = -42,75$. On déduit donc que la solution recherchée doit se trouver dans $[5;10]$.
* On cherche le milieu de $[5;10]$. C'est $7,5$. On calcule $f(7,5) = -8,84375 < 0$. On déduit donc que la solution recherchée doit se trouver dans $[7,5;10]$.
{{ ./dichotomie_fonction_2.png?nolink&400 |}}
Les valeurs exactes des calculs successifs n'ont pas d'importance. Ce qui importe c'est de savoir le signe. C'est parce que $f(0)$ et $f(10)$ sont de signes opposés que l'on est certain de trouver une solution entre $0$ et $10$ -- Considérant que la fonction est continue, soit, dit simplement, qu'elle ne peut passer de $f(0)<0$ à $f(10)>0$ sans passer par $0$.
===== Algorithme =====
Entrées: a, b, bornes de l'intervalle de recherche
f la fonction
e taille de l'intervalle final
Prérequis: a < b ; f(a) et f(b) de signe opposé
Renvoie une approximation de la solution à f(x) = 0
contenue dans [a;b], et avec une erreur inférieur à e
DÉBUT
TANT QUE taille [a;b] >= e RÉPÉTER
m prend la valeur du milieu de [a;b]
SI f(m) et f(a) de signe opposé ALORS
b prend la valeur de m
SINON
a prend la valeur de m
FIN
FIN
RENVOYER (a + b)/2
FIN
===== Implémentation =====
Complétez et testez.
def dichotomie(a:float, b:float, f, e:float) -> float:
"""
a,b : bornes de l'intervalle
f: fonction
e: taille maximale de la solution désirée
renvoie une approx de la solution à f(x) = 0,
solution dans [a;b], avec une erreur < e
"""
assert a < b
assert f(a) * f(b) <= 0 # Vérifie que f(a) et f(b) de signe opposé
assert e > 0
# à vous
if __name__ == "__main__":
# zone de test
def f(x):
return -1/4*x**3 + 9/2*x**2 - 13*x - 59
sol = dichotomie(0,10,f,1e-6)
print(sol)