ATLAS Ouvrir dans l'atlas →

ExerciceTerminale, chapitre 3 — Fonctions numériques · Continuité et théorème des valeurs intermédiaires

Exercice 27 Méthode de dichotomie

AlgorithmiqueDémonstrationCalcul

On reprend encore la fonction ff définie sur ℝ\mathbb{R} par f(x)=x3+3x−5f(x)=x^{3}+3x-5, dont on a montré à l'exercice 24 qu'elle s'annule en un unique réel α\alpha. Le balayage de l'exercice précédent est simple, mais coûteux. On va lui substituer une méthode bien plus rapide, qui repose sur une idée unique : couper l'intervalle en deux, et ne conserver que la moitié qui contient α\alpha.

Partie A : le principe, à la main

1. Rappeler pourquoi f(1)<0f(1)<0 et f(2)>0f(2)>0 permettent d'affirmer que α∈ ]1 ;2[\alpha\in\,]1\,;2[.

2. Calculer f(1,5)f(1{,}5). En comparant son signe à celui de f(1)f(1) et de f(2)f(2), dire dans laquelle des deux moitiés ]1 ;1,5[]1\,;1{,}5[ ou ]1,5 ;2[]1{,}5\,;2[ se trouve α\alpha. Quelle est l'amplitude du nouvel encadrement ?

3. Recommencer avec le milieu de l'intervalle obtenu, et ainsi de suite. Recopier et compléter le tableau suivant, où ana_n et bnb_n désignent les bornes de l'encadrement obtenu après nn étapes, et mnm_n le milieu de [an ;bn][a_n\,;b_n] :

nanbnmnsigne de f(mn)amplitude bn−an0121,511234\begin{array}{|c|c|c|c|c|c|} \hline n & a_n & b_n & m_n & \text{signe de }f(m_n) & \text{amplitude }b_n-a_n \\ \hline 0 & 1 & 2 & 1{,}5 & & 1 \\ \hline 1 & & & & & \\ \hline 2 & & & & & \\ \hline 3 & & & & & \\ \hline 4 & & & & & \\ \hline \end{array}

4. Donner l'encadrement de α\alpha obtenu au bout de 44 étapes, ainsi que son amplitude.

Partie B : pourquoi cela fonctionne, et à quelle vitesse

5. À chaque étape, on remplace [an ;bn][a_n\,;b_n] par l'une de ses deux moitiés. Justifier que : bn−an=12nb_n-a_n=\dfrac{1}{2^{n}}

6. Expliquer précisément à quel moment on utilise le théorème des valeurs intermédiaires, et à quel moment on utilise la stricte monotonie de ff. Que resterait-il de la méthode si ff n'était pas continue ?

7. Déterminer le plus petit entier nn tel que bn−an<10−2b_n-a_n<10^{-2}, puis celui tel que bn−an<10−3b_n-a_n<10^{-3}.

8. Le balayage de pas 10−310^{-3} de l'exercice 26 demandait jusqu'à 1 0001\,000 calculs de ff. Combien la dichotomie en demande-t-elle pour la même précision ? Commenter.

9. Que se passerait-il si l'on appliquait la dichotomie à une fonction continue admettant trois racines dans [a ;b][a\,;b], avec f(a)<0f(a)<0 et f(b)>0f(b)>0 ? La méthode échouerait-elle, ou bien fournirait-elle l'une des racines ?

Partie C : mise en œuvre en Python

10. Recopier et compléter le script suivant, qui renvoie un encadrement de α\alpha d'amplitude strictement inférieure à e :

def dichotomie(a, b, e):
    while b - a >= e:
        m = (a + b) / 2
        if f(m) < 0:
            a = ...
        else:
            b = ...
    return a, b

11. Justifier que la condition du while finit toujours par devenir fausse.

12. Modifier ce script pour qu'il renvoie également le nombre d'étapes effectuées.

Corrigé

Partie A : le principe, à la main

1. ff est continue sur [1 ;2][1\,;2] (fonction polynôme) et f(1)=−1<0<9=f(2)f(1)=-1<0<9=f(2). D'après le théorème des valeurs intermédiaires, l'équation f(x)=0f(x)=0 admet au moins une solution dans ]1 ;2[]1\,;2[ ; et comme ff est strictement croissante, cette solution est unique. Donc α∈ ]1 ;2[.\boxed{\alpha\in\,]1\,;2[.}

2. f(1,5)=1,53+3×1,5−5=3,375+4,5−5=2,875>0f(1{,}5)=1{,}5^{3}+3\times 1{,}5-5=3{,}375+4{,}5-5=\boxed{2{,}875>0}

Cette valeur est du même signe que f(2)f(2), et de signe contraire à f(1)f(1) : le changement de signe a donc lieu entre 11 et 1,51{,}5. On en déduit donc que α∈ ]1 ;1,5[amplitude : 0,5\boxed{\alpha\in\,]1\,;1{,}5[ \qquad \text{amplitude : } 0{,}5}

3. On poursuit, en calculant à chaque étape le milieu puis le signe de son image :

nanbnmnsigne de f(mn)amplitude bn−an0121,5+   (2,875)1111,51,25+   (0,703)0,5211,251,125−   (−0,201)0,2531,1251,251,1875+   (0,237)0,12541,1251,18751,15625+   (0,015)0,0625\begin{array}{|c|c|c|c|c|c|} \hline n & a_n & b_n & m_n & \text{signe de }f(m_n) & \text{amplitude }b_n-a_n \\ \hline 0 & 1 & 2 & 1{,}5 & +\text{ \ \ }(2{,}875) & 1 \\ \hline 1 & 1 & 1{,}5 & 1{,}25 & +\text{ \ \ }(0{,}703) & 0{,}5 \\ \hline 2 & 1 & 1{,}25 & 1{,}125 & -\text{ \ \ }(-0{,}201) & 0{,}25 \\ \hline 3 & 1{,}125 & 1{,}25 & 1{,}1875 & +\text{ \ \ }(0{,}237) & 0{,}125 \\ \hline 4 & 1{,}125 & 1{,}1875 & 1{,}15625 & +\text{ \ \ }(0{,}015) & 0{,}0625 \\ \hline \end{array}

Règle de mise à jour : si f(mn)<0f(m_n)<0, alors α>mn\alpha>m_n (car ff est croissante) et l'on remplace ana_n par mnm_n ; si f(mn)>0f(m_n)>0, alors α<mn\alpha<m_n et l'on remplace bnb_n par mnm_n.

4. Après 44 étapes : 1,125<α<1,1875d’amplitude0,0625=116\boxed{1{,}125<\alpha<1{,}1875 \qquad\text{d'amplitude}\qquad 0{,}0625=\frac{1}{16}} Vérification : on avait trouvé α≈1,155\alpha\approx 1{,}155 à l'exercice 24, ce qui appartient bien à cet intervalle. ✓

Partie B : pourquoi cela fonctionne, et à quelle vitesse

5. À chaque étape, on conserve exactement l'une des deux moitiés de [an ;bn][a_n\,;b_n], donc bn+1−an+1=bn−an2b_{n+1}-a_{n+1}=\frac{b_n-a_n}{2} La suite des amplitudes est donc géométrique de raison 12\frac{1}{2} et de premier terme b0−a0=2−1=1b_0-a_0=2-1=1. On en déduit donc que bn−an=1×(12)n=12n\boxed{b_n-a_n=1\times\left(\frac{1}{2}\right)^{n}=\frac{1}{2^{n}}}

6. Le théorème des valeurs intermédiaires sert à garantir qu'un changement de signe entraîne la présence d'une racine : c'est lui qui autorise, à chaque étape, à affirmer que la moitié conservée contient bien α\alpha. La stricte monotonie sert à garantir que cette racine est unique, donc que les deux moitiés ne peuvent pas en contenir chacune une, et que l'intervalle conservé est bien le bon.

Sans continuité, tout s'effondre : la fonction x↦1xx\mapsto \dfrac{1}{x} sur [−1 ;1][-1\,;1] vérifie f(−1)=−1<0<1=f(1)f(-1)=-1<0<1=f(1), et pourtant elle ne s'annule jamais. La dichotomie appliquée à cette fonction convergerait vers 00, qui n'est pas une racine mais un point de discontinuité.

7. On cherche le plus petit entier nn tel que 12n<10−2\dfrac{1}{2^{n}}<10^{-2}, c'est-à-dire 2n>1002^{n}>100. Or 26=642^{6}=64 et 27=1282^{7}=128, donc n=7\boxed{n=7}.

De même, 12n<10−3\dfrac{1}{2^{n}}<10^{-3} équivaut à 2n>1 0002^{n}>1\,000. Or 29=5122^{9}=512 et 210=1 0242^{10}=1\,024, donc n=10\boxed{n=10}.

8. La dichotomie demande 10 calculs de f\boxed{10 \text{ calculs de } f} pour une précision de 10−310^{-3}, contre jusqu'à 1 0001\,000 pour le balayage.

Commentaire. Le balayage divise l'amplitude par 1010 au prix de 1010 fois plus de calculs : le coût est proportionnel à la précision. La dichotomie, elle, divise l'amplitude par 22 à chaque calcul supplémentaire : gagner un chiffre décimal ne coûte que 33 ou 44 étapes de plus. C'est la différence entre une croissance linéaire et une croissance exponentielle du gain de précision.

9. La méthode n'échoue pas. À chaque étape, le signe de f(mn)f(m_n) est soit celui de f(an)f(a_n), soit celui de f(bn)f(b_n) : dans les deux cas, l'une au moins des deux moitiés présente encore un changement de signe, et c'est celle que l'on conserve. Le procédé converge donc vers une racine.

En revanche, on ne controˆle pas laquelle des trois racines on obtient\boxed{\text{on ne contrôle pas laquelle des trois racines on obtient}} : cela dépend entièrement des valeurs des milieux successifs. C'est bien la stricte monotonie, et elle seule, qui garantissait jusqu'ici que la racine trouvée était la racine.

Partie C : mise en œuvre en Python

10. Comme ff est croissante, f(m)<0f(m)<0 signifie m<αm<\alpha : c'est donc la borne gauche que l'on remonte. Dans le cas contraire, on abaisse la borne droite.

def dichotomie(a, b, e):
    while b - a >= e:
        m = (a + b) / 2
        if f(m) < 0:
            a = m
        else:
            b = m
    return a, b

11. À chaque tour de boucle, la quantité b - a est divisée par 22 : elle vaut b0−a02n\dfrac{b_0-a_0}{2^{n}} après nn tours. Comme (12)n\left(\frac{1}{2}\right)^{n} tend vers 00, elle finit par devenir strictement inférieure à e, et la condition du while devient fausse. La boucle se termine donc toujours.\boxed{\text{La boucle se termine donc toujours.}}

12. Il suffit d'ajouter un compteur :

def dichotomie(a, b, e):
    n = 0
    while b - a >= e:
        m = (a + b) / 2
        if f(m) < 0:
            a = m
        else:
            b = m
        n = n + 1
    return a, b, n

Dans l'édifice

Thèmes

continuité, théorème des valeurs intermédiaires, dichotomie, valeur approchée, Python, exponentielle, polynôme, suite

Notions

continuité, exponentielle, suite

Ouvrir dans l'atlas interactif →