Écrire une fonction Python dichotomie(f, a, b, eps) qui approche une solution de f(x) = 0 sur [a, b] à eps près, en supposant que \(f(a)\) et \(f(b)\) sont de signes opposés.
- Vérifier au début de la fonction que \(f(a) \cdot f(b) \leq 0\) (sinon lever une
ValueError). - Tant que \(b - a > \varepsilon\), calculer \(m = (a+b)/2\) et réduire l'intervalle en gardant la moitié où \(f\) change de signe.
- Retourner \((a + b)/2\).
- Tester avec \(f(x) = x^3 - 2\) sur \([1\,;\,2]\) et une précision \(10^{-6}\). Tu dois trouver \(\sqrt[3]{2} \approx 1{,}2599\).
Voir la correction
def dichotomie(f, a, b, eps):
if f(a) * f(b) > 0:
raise ValueError("f(a) et f(b) doivent être de signes opposés")
while b - a > eps:
m = (a + b) / 2
if f(a) * f(m) <= 0:
b = m
else:
a = m
return (a + b) / 2
# Test
racine = dichotomie(lambda x: x**3 - 2, 1, 2, 1e-6)
print(racine) # 1.25992...
Complexité : après \(n\) itérations, la largeur vaut \((b_0 - a_0)/2^n\). Pour une précision \(\varepsilon\), il faut \(n \approx \log_2((b-a)/\varepsilon)\) étapes — soit environ 20 pour passer d'une largeur 1 à \(10^{-6}\).