Résolution approchée d'une équation par dichotomie

Il arrive, en mathématiques, d'être confronté à une équation que l'on ne peut pas résoudre algébriquement. Il est alors possible d'utiliser un algorithme permettant de calculer une valeur approchée d'une solution de l'équation.

On considère dans cet exercice l'équation \((E)\) : \(f(x)=0\) :

  • supposons que l'on connaisse déjà un intervalle de recherche à cibler, l'intervalle \(\left[ \text{début}\,;\,\text{fin}\right]\) ;

  • supposons de plus que la fonction \(f\) est continue et strictement monotone sur cet intervalle.

Dans ce cas-là, nous pouvons utiliser l'algorithme de dichotomie.

Si \(C_f\) est la courbe représentative de \(f\), résoudre \((E)\) revient à déterminer l'abscisse d'un point d'intersection de \(C_f\) avec l'axe des abscisses.

Equation

Voici les trois premières étapes, dans le cas particulier représenté ci-dessus, du déroulement de cet algorithme :

  • On calcule l'abscisse du milieu de l'intervalle de recherche ;
  • On observe que \(f(\text{milieu})\) et \(f(\text{fin})\) sont de signes contraires ;
  • On doit donc poursuivre la recherche sur l'intervalle \([\text{milieu}\,;\,\text{fin}]\) (sur la droite de l'intervalle de recherche comme illustré ci-dessous).

Equation

  • On calcule à nouveau l'abscisse du milieu de l'intervalle de recherche ;
  • On observe que \(f(\text{milieu})\) et \(f(\text{fin})\) sont de mêmes signes ;
  • On doit donc poursuivre la recherche sur l'intervalle \([\text{début}\,;\,\text{milieu}]\) (sur la gauche de l'intervalle de recherche comme illustré ci-dessous).

Equation

  • On calcule toujours l'abscisse du milieu de l'intervalle de recherche ;
  • On observe que \(f(\text{milieu})\) et \(f(\text{fin})\) sont de signes contraires ;
  • On doit donc poursuivre la recherche sur l'intervalle \([\text{milieu}\,;\,\text{fin}]\) (sur la droite de l'intervalle de recherche comme illustré ci-dessous).

Equation

👉 On continue le processus jusqu'à obtenir un encadrement de la solution d'amplitude désirée.

Valeurs de mêmes signes ?

On rappelle que les réels \(a\) et \(b\) distincts non nuls sont de même signe équivaut à : \(a \times b > 0\)

Si une solution exacte de l'équation n'a pas été trouvée (ce qui est le plus souvent le cas), on répète le principe de dichotomie en divisant par deux l'amplitude de l'intervalle de recherche à chaque étape, jusqu'à ce que son amplitude soit inférieure à une précision souhaitée.

Exprimé en français l'algorithme de dichotomie est donc le suivant (cliquer sur les + pour lire les explications en commentaires):

Algorithme de dichotomie
Fonction dichotomie(debut, fin, precision) :                   # (1)
    Tant que fin - debut > precision :
        milieu = (debut + fin) / 2
        Si f(milieu) × f(fin) est strictement positif :        # (2)
            fin = milieu
        Sinon si f(milieu) × f(fin) est strictement négatif :  # (3)
            debut = milieu
        Sinon                                                  # (4)
            Renvoyer (milieu, milieu)                          # (5)
    Renvoyer (debut, fin)
  1. La fonction prend trois paramètres : le debut et la fin de l'intervalle de recherche ainsi que la précision.
  2. milieu est strictement supérieur à la solution.
  3. milieu est strictement inférieur la solution.
  4. milieu est la solution. On renvoie l'intervalle [milieu, milieu]
  5. L'instruction Renvoyer provoque la sortie de la fonction. C'est ici une sortie anticipée car la solution a été trouvée. Il est inutile de continuer à la chercher.

Nous allons utiliser cette méthode afin de déterminer une valeur approchée à \(10^{-6}\) près de l'équation :

\[-x^3+x^2+x+1=0\]

équation

Écrire le code de la fonction dichotomie qui prend en paramètres les nombres debut, fin et precision.

debut, fin délimitent l'intervalle de recherche et precision est la précision souhaitée.

Cette fonction renvoie un intervalle d'amplitude precision contenant la solution de l'équation étudiée.

assert ?

Le mot clé assert est utilisé en Python afin de vérifier que des propositions sont vraies.

Ainsi, l'instruction assert 3 + 5*7 == 38 permet de vérifier que l'expression 3 + 5*7 est bien évaluée à 38.

Si c'est le cas, le programme continue de se dérouler normalement. Dans le cas contraire, le programme est interrompu et une erreur est signalée.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.1280132h)-=3nqèAp:a^gys0or kx}8z*éwu7dmSclPàtCf._Rvb;561(+{4ie9,/050G0(0N0n0%0K0r0v0J0K0n0r0r0f010N0%0l010406050r0E0H0H0n0u0q040I0t0K0E0 0t0h0v020n0H0l0V0v0S0(190u0i0E0(0r050+16181a1c140l04051H1A1K0+1H140G0%0T0@0_0{0}0c0%0p0c0K1Y0c0N12050/0U0K0(1T0`0|011X1Z1#1Z0N1+1-1)0N0u1I0N0c0@1f0r0l0n0h0}0b011/1V010P0;0(0h1n0(1)25272c1;2f1-2i0H2k040a0v0L0u0t0l0t0r0%1i1k0-230u0u0(0J2F1A2m0h1I0+212R1~201 1*0G2o0}1#0h2h2C1)1Q1S0^1:2#0%2%0h0t2+1)0l2K1I2P2R2|15261k2-2d2=0u190K120v0Y2O30132 2n321;3436380b3b273d2P2!013i0n37040v0g3m2Q143p3g0}3s3u0v0$3y3o303q3E380W3I3A3K3C3r0t353t380X3P3e311U3h3U3j3v0F3Z3B3$3D3(3W3v0z3,3R3.3T3V3F0)3@3f3_3M040Y0s3~3#2.3`3)0Y3a1B3c3Q3 47410Y3l4c3n4e46333:3u0Y3x4k2Q1L2`1A2+2U0G202Z3S0J2?2u0,1R1I2_0(2{3c3I054E0-4M4f2d0w120-0P4O3-470D384Z3^4g0P124Y4t4S4n1;11040Z4(4T3h120x4^4:0}4=0d0m3P0v540v3!3q4V042K0N0E0u0h3I564!2d0t120e4}3q4=4@4.573S0h4{5n3S5k040B0B5w3_0H0%124s2~5i4;120d5g5s3_5y0!5N5J3D5v5r5T015y5A5C475E124j2|5h4)5j125R4.5+4_5U044|5:5O475Q5S5,1;5%423P4m584W0(4-5I5~0}4$3v5#334+041Q0J0c0t0N0t5E0(6d5K4?6p5?0-0U1h6s014=0*5}5=3r4,2:6x6z6B4~6D044K0J0%2D1j6G5L524.06555;6J590D1X1-6I3L6E5f5_5X5y5m6+696K6u6w6/6C5y020p0N0V6%5t126M6O0%6Q5W6:4=6T2|6V6W555`33125E1#0(0E6~5P120f7k475p6x5u6g0(6v0N7o5-045/5*7d4`042f6*686C507x1;5y0+7K0}605)4d7b7c5X590%673c6X6(7E6R6r756C7s7g0%7i7%5M6@6J5Z7O6K7Y3n7C4 125q7H6J7s7F7/7@6_6{6}7;3q60447)6J77537T7b7{7^6F885x7m7@7+0;7-7j6U8g7!3S590(1#7_2Q8v404,7%7~4N5X8p7h8s7 5o5L84125B8l8D7$8c8N7(8M6 7E8k8Y3_7J8S5{12020K6|7@8a7%787S8u7U6:7s6=7w8)7y7n8}7D7,7.8t8g8i8x0=6o8V3S8e948@8C47595b5d7G7Z8i7q9a8T928L8H76126A905?9q839d9f4U129i5e7@9n8$4g657v7%9v7B8I6)9z791A4Q4L4v9V0+4y1A0N4A9!2X2S0n1,9X4y1G4/3q2K0H0R0P0n0w0(0R0c0g121s1u1w1y0v8=7`1N3d1H0O0.0v3t0p3U2E0c2t0v1y0N0v2K0_0 0T1t2hak662f0J0n0J1.av0u0v0M0@0c0na10v0C0/0l1.0;230EaK0v0_0v0A1j1.2H2K6i0(0uaYai2G7i0x0Q1La7040k2:2D0*0v0G270?0K000(0x1t0l1-0v2_0C0J0C0-0h0Na;aR0GaIaZ5E2i2Fa=000E2%0v0r1f1h731k0n0l2_0t6i0C1.aC8i1aaf190Na{12090Z430o0#0e0X0y097:5*2_0j0ra;2hb01a0/b6bgbi1.aT2%06aW2L0caZa#2:0 3taV1.0_0u0p7iaAby0ubA0nbC0xbEbGbN5g0hb21y2DbC9B1;bz21bBbD04bF43c35:aIbqa2azca0}ccagb~cfbF091-0P0N0Z090P0uaw4i09b|1_0dbI0)0y1l86390sbIbKcM6`6|0vcw66czcBcD0JcFcH1%cJ0#43bMbO3ca*a6149Y0.0:0=04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.1280132h)-=3nqèAp:a^gys0or kx}8z*éwu7dmSclPàtCf._Rvb;561(+{4ie9,/050G0(0N0n0%0K0r0v0J0K0n0r0r0f010N0%0l010406050r0E0H0H0n0u0q040I0t0K0E0 0t0h0v020n0H0l0V0v0S0(190u0i0E0(0r050+16181a1c140l04051H1A1K0+1H140G0%0T0@0_0{0}0c0%0p0c0K1Y0c0N12050/0U0K0(1T0`0|011X1Z1#1Z0N1+1-1)0N0u1I0N0c0@1f0r0l0n0h0}0b011/1V010P0;0(0h1n0(1)25272c1;2f1-2i0H2k040a0v0L0u0t0l0t0r0%1i1k0-230u0u0(0J2F1A2m0h1I0+212R1~201 1*0G2o0}1#0h2h2C1)1Q1S0^1:2#0%2%0h0t2+1)0l2K1I2P2R2|15261k2-2d2=0u190K120v0Y2O30132 2n321;3436380b3b273d2P2!013i0n37040v0g3m2Q143p3g0}3s3u0v0$3y3o303q3E380W3I3A3K3C3r0t353t380X3P3e311U3h3U3j3v0F3Z3B3$3D3(3W3v0z3,3R3.3T3V3F0)3@3f3_3M040Y0s3~3#2.3`3)0Y3a1B3c3Q3 47410Y3l4c3n4e46333:3u0Y3x4k2Q1L2`1A2+2U0G202Z3S0J2?2u0,1R1I2_0(2{3c3I054E0-4M4f2d0w120-0P4O3-470D384Z3^4g0P124Y4t4S4n1;11040Z4(4T3h120x4^4:0}4=0d0m3P0v540v3!3q4V042K0N0E0u0h3I564!2d0t120e4}3q4=4@4.573S0h4{5n3S5k040B0B5w3_0H0%124s2~5i4;120d5g5s3_5y0!5N5J3D5v5r5T015y5A5C475E124j2|5h4)5j125R4.5+4_5U044|5:5O475Q5S5,1;5%423P4m584W0(4-5I5~0}4$3v5#334+041Q0J0c0t0N0t5E0(6d5K4?6p5?0-0U1h6s014=0*5}5=3r4,2:6x6z6B4~6D044K0J0%2D1j6G5L524.06555;6J590D1X1-6I3L6E5f5_5X5y5m6+696K6u6w6/6C5y020p0N0V6%5t126M6O0%6Q5W6:4=6T2|6V6W555`33125E1#0(0E6~5P120f7k475p6x5u6g0(6v0N7o5-045/5*7d4`042f6*686C507x1;5y0+7K0}605)4d7b7c5X590%673c6X6(7E6R6r756C7s7g0%7i7%5M6@6J5Z7O6K7Y3n7C4 125q7H6J7s7F7/7@6_6{6}7;3q60447)6J77537T7b7{7^6F885x7m7@7+0;7-7j6U8g7!3S590(1#7_2Q8v404,7%7~4N5X8p7h8s7 5o5L84125B8l8D7$8c8N7(8M6 7E8k8Y3_7J8S5{12020K6|7@8a7%787S8u7U6:7s6=7w8)7y7n8}7D7,7.8t8g8i8x0=6o8V3S8e948@8C47595b5d7G7Z8i7q9a8T928L8H76126A905?9q839d9f4U129i5e7@9n8$4g657v7%9v7B8I6)9z791A4Q4L4v9V0+4y1A0N4A9!2X2S0n1,9X4y1G4/3q2K0H0R0P0n0w0(0R0c0g121s1u1w1y0v8=7`1N3d1H0O0.0v3t0p3U2E0c2t0v1y0N0v2K0_0 0T1t2hak662f0J0n0J1.av0u0v0M0@0c0na10v0C0/0l1.0;230EaK0v0_0v0A1j1.2H2K6i0(0uaYai2G7i0x0Q1La7040k2:2D0*0v0G270?0K000(0x1t0l1-0v2_0C0J0C0-0h0Na;aR0GaIaZ5E2i2Fa=000E2%0v0r1f1h731k0n0l2_0t6i0C1.aC8i1aaf190Na{12090Z430o0#0e0X0y097:5*2_0j0ra;2hb01a0/b6bgbi1.aT2%06aW2L0caZa#2:0 3taV1.0_0u0p7iaAby0ubA0nbC0xbEbGbN5g0hb21y2DbC9B1;bz21bBbD04bF43c35:aIbqa2azca0}ccagb~cfbF091-0P0N0Z090P0uaw4i09b|1_0dbI0)0y1l86390sbIbKcM6`6|0vcw66czcBcD0JcFcH1%cJ0#43bMbO3ca*a6149Y0.0:0=04.