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'expression 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)
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 : 5/5

.128013lS^et-dA5fz18umaèg,_/R=in{ 6)yàqPhc\(bsx.p;r4C'90"ov+w73k:é *}2030b08090k0s050H0$0D050k0H0H0r0S090s0K0S020v030H0i0j0j0k0M0y02060T050i0|0T0t0$000k0j0K0L0$0q08160M0A0i080H030p13151719110K02031E1x1H0p1E110b0s0U0;0?0^0`0C0s0m0C051V0C090 030,0G05081Q0@0_0S1U1W1Y1W091'1)1$090M1F090C0;1c0H0K0k0t0`0(0S1+1S0S0e0.080t1k081$2123281-2b1)2e0j2g02040$0B0M0T0K0T0H0s1f1h0*1 0M0M080D2B1x2i0t1F0p1}2N1`1|1{1%0b2k0`1Y0t2d2y1$1N1P0=1,2X0s2Z0t0T2%1$0K2G1F2L2N2@12221h2(292-0M16050 0$0g2K2{102`2j2}1-2 31330(3623382L2W0S3d0k32020$0Y3h2M113k3b0`3n3p0$0N3t3j2{3l3z330d3D3v3F3x3m0T303o330w3K392|1R3c3P3e3q0X3U3w3X3y3Z3R3q0h3%3M3(3O3Q3A0Q3.3a3:3H020g0R3^3W2)3;3!0g351y373L3_413{0g3g463i48402~3*3p0g3s4e2M1I2=1x2%2Q0b1|2V3N0D2.2q0)1O1F2;082?373D034y0*4G49290Z0 0*0e3D0$3V3G0e0 4S4n4M4h1-0~020F4I3'4a0 0I4*3/414'0x0!3K0$4_4U4+4O0 2G090i0M0t4T4V3N0T0 0a4/4N4%0 4)4!553`4-5a4$0`57020%0%5j3l0j0s0 4m2_4|5c020x545x5l0 0V5B4:2~5i5f5C0S5m5o5q3N5s0 4d2@4{5H1-5m5F4!5V5b3y5J5U5g415Y5G5$0S5R3|3K4g3l4P024R5,5k3m4X5^0s0D0C0T090T5s085P3:4'5e5w5W5%5^080G1e674;0 0n5`3G4Y2+6i294'6l5!5)5I024E0D0s2z1g6q5y4?4^4`6v1-5@0W1U1)6m3N0t6o536u5L5m596T6c3m4Q6f6h6X5-5m000m090L6O5h6x2G6z6B6S6b5-4'4@4!0v4`6}5#5{6Q025s1Y080i6-5*0 0r776r5d6D6d0*6g097b5X5E7j6d2b6?4H5L4=7m5M0 0p7t5/5T476~6H5L5@0s4Z5(5L717G7q6Y697e6Z720.0s757O7s6%5{5N7t7J7U7d5K6Y7J6p7%6^0 5A7W3l6(6*6,7.5Q5t023~7*5{6_6G7B6}6I7n7)7H6Y5m7a7?6.737S766{7 6 5?0 081Y7K3i8f6P4Y7#4(7O718a7T7{3l7V846'0 5p884,028k4o7r7$6@706R8p7-8y7X0 00056+7x7^7`8J8w0 6`2@6|8e7C7'6!7h7t867Z0 8t8c8#8e810S5@8i0H668v3N7}8d8%4_8?5@4 517p8l8?7N8|897R8u8X8}6k8-7Q748:7L7+5z7~8m3:930+957t999e6.7g6$9w6j026t8O6n8E839l7|7,3U0p4K4F4p9O0p4s1x094u9T2T2O0k1(9Q4s1D4#3l2G0j0o0e0k0Z080o0C0Y0 1p1r1t1v0$8!4H1K381E0O0+0$3o0m3P2A0C2p0$1v090$2G0?0|0U1q2dac080e2b0D0k0D1*ao0M0$0z0;0C0k9_0$0#0,0K1*0.1 0iaD0$0?0$0f1g1*2D6:0C080M601*2d0$0*0i0I0J1I9 020c2+2z0naX230:050P080I1q0K1)0$2;0#0D0#0*0t09a+aK0baBaS5s2e2BaX0P0i2Z0$0H1c1e0s1ga30K2;0T600#1*av8?17a71609a;0 0E0F3}070u0a0w0'0E8N37a_0M0l0Ha+aW220M0,a b9bb1*aM2Z0vaP2HaRaTaR0$2+0|3oaO1*0?0M0m75atbr0Mbt0kbv0IbxbzbG4T0ta{1v2zbv9p41bs1}bubw02by3}b}5!aB0kaD0:asc429c6a8b^c9by0E1)0e090F0E0e0Map4c0Eb?1=0xbB0Q0'1i7;340RbBbDcH6)6+0$cralcucwcy0DcAcC1!cE0u3}bFbH3ia#9~119R0+0-0/02.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
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 : 5/5

.128013lS^et-dA5fz18umaèg,_/R=in{ 6)yàqPhc\(bsx.p;r4C'90"ov+w73k:é *}2030b08090k0s050H0$0D050k0H0H0r0S090s0K0S020v030H0i0j0j0k0M0y02060T050i0|0T0t0$000k0j0K0L0$0q08160M0A0i080H030p13151719110K02031E1x1H0p1E110b0s0U0;0?0^0`0C0s0m0C051V0C090 030,0G05081Q0@0_0S1U1W1Y1W091'1)1$090M1F090C0;1c0H0K0k0t0`0(0S1+1S0S0e0.080t1k081$2123281-2b1)2e0j2g02040$0B0M0T0K0T0H0s1f1h0*1 0M0M080D2B1x2i0t1F0p1}2N1`1|1{1%0b2k0`1Y0t2d2y1$1N1P0=1,2X0s2Z0t0T2%1$0K2G1F2L2N2@12221h2(292-0M16050 0$0g2K2{102`2j2}1-2 31330(3623382L2W0S3d0k32020$0Y3h2M113k3b0`3n3p0$0N3t3j2{3l3z330d3D3v3F3x3m0T303o330w3K392|1R3c3P3e3q0X3U3w3X3y3Z3R3q0h3%3M3(3O3Q3A0Q3.3a3:3H020g0R3^3W2)3;3!0g351y373L3_413{0g3g463i48402~3*3p0g3s4e2M1I2=1x2%2Q0b1|2V3N0D2.2q0)1O1F2;082?373D034y0*4G49290Z0 0*0e3D0$3V3G0e0 4S4n4M4h1-0~020F4I3'4a0 0I4*3/414'0x0!3K0$4_4U4+4O0 2G090i0M0t4T4V3N0T0 0a4/4N4%0 4)4!553`4-5a4$0`57020%0%5j3l0j0s0 4m2_4|5c020x545x5l0 0V5B4:2~5i5f5C0S5m5o5q3N5s0 4d2@4{5H1-5m5F4!5V5b3y5J5U5g415Y5G5$0S5R3|3K4g3l4P024R5,5k3m4X5^0s0D0C0T090T5s085P3:4'5e5w5W5%5^080G1e674;0 0n5`3G4Y2+6i294'6l5!5)5I024E0D0s2z1g6q5y4?4^4`6v1-5@0W1U1)6m3N0t6o536u5L5m596T6c3m4Q6f6h6X5-5m000m090L6O5h6x2G6z6B6S6b5-4'4@4!0v4`6}5#5{6Q025s1Y080i6-5*0 0r776r5d6D6d0*6g097b5X5E7j6d2b6?4H5L4=7m5M0 0p7t5/5T476~6H5L5@0s4Z5(5L717G7q6Y697e6Z720.0s757O7s6%5{5N7t7J7U7d5K6Y7J6p7%6^0 5A7W3l6(6*6,7.5Q5t023~7*5{6_6G7B6}6I7n7)7H6Y5m7a7?6.737S766{7 6 5?0 081Y7K3i8f6P4Y7#4(7O718a7T7{3l7V846'0 5p884,028k4o7r7$6@706R8p7-8y7X0 00056+7x7^7`8J8w0 6`2@6|8e7C7'6!7h7t867Z0 8t8c8#8e810S5@8i0H668v3N7}8d8%4_8?5@4 517p8l8?7N8|897R8u8X8}6k8-7Q748:7L7+5z7~8m3:930+957t999e6.7g6$9w6j026t8O6n8E839l7|7,3U0p4K4F4p9O0p4s1x094u9T2T2O0k1(9Q4s1D4#3l2G0j0o0e0k0Z080o0C0Y0 1p1r1t1v0$8!4H1K381E0O0+0$3o0m3P2A0C2p0$1v090$2G0?0|0U1q2dac080e2b0D0k0D1*ao0M0$0z0;0C0k9_0$0#0,0K1*0.1 0iaD0$0?0$0f1g1*2D6:0C080M601*2d0$0*0i0I0J1I9 020c2+2z0naX230:050P080I1q0K1)0$2;0#0D0#0*0t09a+aK0baBaS5s2e2BaX0P0i2Z0$0H1c1e0s1ga30K2;0T600#1*av8?17a71609a;0 0E0F3}070u0a0w0'0E8N37a_0M0l0Ha+aW220M0,a b9bb1*aM2Z0vaP2HaRaTaR0$2+0|3oaO1*0?0M0m75atbr0Mbt0kbv0IbxbzbG4T0ta{1v2zbv9p41bs1}bubw02by3}b}5!aB0kaD0:asc429c6a8b^c9by0E1)0e090F0E0e0Map4c0Eb?1=0xbB0Q0'1i7;340RbBbDcH6)6+0$cralcucwcy0DcAcC1!cE0u3}bFbH3ia#9~119R0+0-0/02.