Le compagnon de l'élève chercheur

À la une /Le Labo Info

Programmer la dichotomie : ce que le TVI ne dit pas

Le théorème des valeurs intermédiaires garantit qu’une solution existe et ne donne aucun moyen de la trouver. Vingt lignes de Python comblent l’écart — et le compteur d’itérations démontre la vitesse de convergence.

Relisez l’énoncé du théorème des valeurs intermédiaires : il dit il existe. Il ne dit pas où.

C’est la première démonstration d’existence de l’année qui ne produit pas l’objet. Pour f(x)=x5+x1f(x) = x^5 + x - 1 sur [0;1][0;1], le TVI conclut immédiatement — et aucune formule ne donne la racine, parce qu’il n’en existe pas par radicaux.

C’est une limite du théorème, pas un défaut de l’élève. Et c’est exactement pourquoi les sujets enchaînent toujours de la même façon :

  1. Montrer que l’équation admet une unique solution α\alpha. TVI pour l’existence, stricte monotonie pour l’unicité — les deux sont nécessaires, le TVI seul ne donne jamais l’unicité.
  2. Encadrer α\alpha.
  3. Donner une valeur approchée à 10210^{-2} près. Ici seulement, la dichotomie.

L’étape 3 est la réponse à l’étape 1. Le théorème dit elle existe ; l’algorithme dit la voici.

L’algorithme

def dichotomie(f, a, b, precision=1e-6):
    """Encadre une racine de f sur [a, b], où f(a) et f(b) sont de signes contraires."""
    if f(a) * f(b) > 0:
        raise ValueError("f(a) et f(b) doivent être de signes contraires")

    n = 0
    while b - a > precision:
        m = (a + b) / 2
        if f(a) * f(m) <= 0:
            b = m          # la racine est dans [a, m]
        else:
            a = m          # la racine est dans [m, b]
        n += 1

    return (a + b) / 2, n


racine, iterations = dichotomie(lambda x: x**5 + x - 1, 0, 1)
print(f"{racine:.6f} en {iterations} itérations")

C’est le test du TVI, écrit une fois et répété. La ligne if f(a) * f(m) <= 0 teste un produit, pas deux signes séparément — la même condition f(a)f(b)0f(a) \cdot f(b) \le 0 que dans le cours.

Ce que le compteur démontre

Sur f(x)=x5+x1f(x) = x^5 + x - 1, précision 10610^{-6} : 20 itérations.

Ce n’est pas une observation, c’est une conséquence. À chaque tour l’intervalle est divisé par deux :

bnan=ba2nb_n - a_n = \frac{b - a}{2^{\,n}}

La condition d’arrêt ba2n<ε\dfrac{b-a}{2^{\,n}} < \varepsilon donne

n>ln ⁣(baε)ln2n > \frac{\ln\!\left(\dfrac{b-a}{\varepsilon}\right)}{\ln 2}

soit n>ln(106)ln219,9n > \dfrac{\ln(10^{6})}{\ln 2} \approx 19{,}9. Le programme confirme la majoration au tour près.

Cette majoration est la partie utile à l’examen : elle se démontre à la main, en trois lignes, et c’est elle que l’on demande quand le sujet dit « combien d’itérations suffisent pour obtenir un encadrement d’amplitude 10310^{-3} ? ».

Le détail qui coûte une racine

L’inégalité de la ligne 9 est large : <= 0, pas < 0.

Si f(m)f(m) vaut exactement 00, on a trouvé la racine. Le produit f(a)f(m)f(a) \cdot f(m) est alors nul, et il faut conserver mm comme borne. Un test strict l’écarte, et l’algorithme continue de rétrécir un intervalle dont il vient d’expulser la solution.

L’erreur ne se voit ni à la lecture ni sur x5+x1x^5 + x - 1, dont la racine est irrationnelle. Elle apparaît sur f(x)=x21f(x) = x^2 - 1 avec [a,b]=[0;2][a,b] = [0;2] : le premier milieu vaut 11, qui est la racine exacte.

C’est la même largeur d’inégalité que dans l’énoncé du cours — f(a)f(b)0f(a) \cdot f(b) \le 0, et non <0< 0. Le programme ne fait que rendre visible ce que la notation disait déjà.

L’erreur de rédaction symétrique

Écrire « d’après le TVI, α0,75\alpha \approx 0{,}75 ».

Le TVI ne donne aucune valeur. Ce qui donne 0,750{,}75, c’est le calcul de f(0,75)f(0{,}75) et f(0,76)f(0{,}76) et le changement de signe entre les deux — c’est-à-dire une dichotomie, même faite à la main sur une copie.

Nommer l’outil qui produit réellement le résultat : c’est la différence entre une copie juste et une copie qui rapporte.