Recherche de zero d'une fonction MARMAD ANAS MPSI -2
Définition d’ un algorithme de recherche d'un zéro d’une fonction Dichotomie Principe de la méthode Preuve de la méthode dichotomique Terminaison La complexité Graphiquement Algorithme Programmation en Python Exemple
Un algorithme de recherche d'un zéro d’une fonction est une méthode numérique ou un algorithme de recherche d’une valeur approchée d’un x vérifiant f(x) = 0, pour une fonction donnée d. Ici, x est un nombre réel appelé zéro de f ou lorsque f est polynomiale, racine de f.
La méthode de dichotomie ou méthode de la bissection est l'algorithme le plus simple pour trouver des zéros d'une fonction continue : commencer avec deux points a et b qui encadrent un zéro de la fonction, et à chaque itération, choisir l’un des deux intervalles [a, c] ou [c, b], c = (a + b) ⁄ 2 étant le milieu de a et b. L’algorithme repose sur le choix du sous- intervalle de [a, b] qui contient un zéro. Dans la plupart des cas, la méthode de dichotomie garantit la convergence vers un zéro lorsque la fonction est continue. Sa progression dans la recherche est plutôt lente, puisque sa vitesse de convergence est linéaire
On considère deux nombres réels a et b et une fonction réelle f continue sur l'intervalle [a, b] telle que f(a) et f(b) soient de signes opposés. Supposons que nous voulions résoudre l'équation f(x) = 0. D'après le théorème des valeurs intermédiaires, f a au moins un zéro dans l’intervalle [a, b]. La méthode de dichotomie consiste à diviser l’intervalle en deux en calculant m = (a+b) / 2. Il y a maintenant deux possibilités : ou f(a) et f(m) sont de signes contraires, ou f(m) et f(b) sont de signes contraires. L’algorithme de dichotomie est alors appliqué au sous- intervalle dans lequel le changement de signe se produit, ce qui signifie que l’algorithme de dichotomie est récursif.
L’erreur absolue de la méthode de dichotomie est au plus b-a /2 n+1, après n étapes car l'erreur est diminuée de moitié à chaque étape. Ainsi, la méthode converge linéairement, ce qui est très lent par comparaison avec la méthode de Newton. L'avantage par rapport à cette dernière est son domaine d'application plus vaste : il suffit seulement que f(a) et f(b) soient de signes opposés et qu'on puisse déterminer le signe de f(m) à chaque itération. De plus, si l'on se donne la tolérance relative ε, on sait majorer le nombre d'itérations nécessaires pour satisfaire cette tolérance : 2 n+1 ≤ 1/ε
Soit [a, b] l’intervalle de recherche et f continue sur [a, b] : f (a k )f (b k ) < 0 est un invariant de boucle (démonstration par récurrence) ∀ k, ∃ un zéro de f dans [a k, b k ] En particulier, en sortie de boucle x 0 ∈ [a n, b n ] avec b n − a n < ε soit x 0 − ε < x < x 0 + ε
Montrons que l’algorithme termine toujours : Soit u k = (b k − a k ) Par récurrence : u k = (b-a) / 2 k Donc (u k ) décroissante et en +∞ : u k → 0 Donc ∀ ε > 0, ∃ n 0 ∈ N tel que u n0 < ε et l’algorithme termine.
La complexité de la méthode dichotomique est : 0 (log 2 (b-a/ε)) Pour démontrer ca, soit n le nombre d’itérations effectuées à la sortie de la boucle or (b n − a n ) ≤ ε, avec (b n − a n ) =(b 0 - a 0 )/2 n donc [(b 0 - a 0 )/2 n ] ≤ ε d’ou la complexité est dominé par n =log 2 (b-a/ε)
On cherche le zéro d’une fonction sur un intervalle ]a,b[, c’est-à-dire on cherche x tel que f (x ) = 0. On va faire des hypothèses : on sait calculer f en tout point ; la fonction f est continue ; f (a) et f (b) sont de signes différents,
Par exemple : y = f (x )y = f (x ) x a f (a)f (a) b f (b)f (b)
y = f (x )y = f (x ) x a f (a)f (a) b f (b)f (b)
Ou encore : y = f (x )y = f (x ) x a f (a)f (a) b f (b)f (b)
Mais pas : y = f (x )y = f (x ) x a f (a)f (a) b f (b)f (b)
Principe de la méthode y = f (x )y = f (x ) x a b
y = f (x )y = f (x ) x a f (a)f (a) b f (b)f (b)
y = f (x )y = f (x ) x a f (a)f (a) b f ( b ) f ( a ) et f ( b ) sont de signes opposés : on est surs qu’il existe un zéro dans ] a,b [.
y = f (x )y = f (x ) x a f (a)f (a) b f (b)f (b) 2 On regarde au milieu, au point m = a + b pour voir le signe de f (m).f (m).
y = f (x )y = f (x ) x a f (a)f (a) b f (b)f (b) m 2 f (m).f (m).
x a b f (b)f (b) m y = f (x )f (m)f (a)y = f (x )f (m)f (a) 2 f (m).f (m).
x a b m y = f (x )f (m)f (a)y = f (x )f (m)f (a) f ( b ) Ici, f ( m ) et f ( a ) sont de même signe, on n’est pas surs qu’il y ait un zéro entre a et m
x a b m y = f (x )f (m)f (a)y = f (x )f (m)f (a) f ( b ) par contre, on est surs qu’il y a en a un entre m et b.
x a b m y = f (x )f (m)f (a)y = f (x )f (m)f (a) f ( b ) par contre, on est surs qu’il y a en a un entre m et b.
x a b m y = f (x )f (m)f (a)y = f (x )f (m)f (a) f ( b ) On s’est ramenés au problème du début : il suffit de recommencer
x b m y = f (x )f (m)y = f (x )f (m) a f ( b ) On doit donc refaire pareil en mettant a en m
x b f (b)f (b) a y = f (x )f (a)y = f (x )f (a) m
x b a y = f (x )f (a)y = f (x )f (a) m f ( m ) f ( b ) f ( m ) est d’un autre signe que f ( a ), il y a avec certitude un zéro entre les deux.
x b a y = f (x )f (a)y = f (x )f (a) m f ( m ) f ( b ) f ( m ) est d’un autre signe que f ( a ), il y a avec certitude un zéro entre les deux.
x b a y = f (x )f (a)y = f (x )f (a) m f (m)f (b)f (m)f (b)
x b a y = f (x )f (a)y = f (x )f (a) f (m)f (b)f (m)f (b) mbmb
x a y = f (x )f (a)y = f (x )f (a) b f (b)f (b)
x a y = f (x )f (a)y = f (x )f (a) b f (b)f (b) On s’est ramenés au problème du début encore une fois.
x a y = f (x )f (a)y = f (x )f (a) b f (b)f (b) L’intervalle ] a,b [ étant plus petit, on a amélioré la précision.
x a y = f (x )f (a)y = f (x )f (a) b f (b)f (b) Le zéro est à nouveau dans ] a,b [
x a y = f (x )f (a)y = f (x )f (a) b f (b)f (b) La valeur approchée que l’on peut donner est...
x a y = f (x )f (a)y = f (x )f (a) b f (b)f (b) a+b2a+b2 La valeur approchée que l’on peut donner est x 0 ≃ a + b 2
x a y = f (x )f (a)y = f (x )f (a) b f (b)f (b) a+b2a+b2 Et l’erreur maximale (la précision) est
x a y = f (x )f (a)y = f (x )f (a) b f (b)f (b) a+b2a+b2 b−a b−a22b−a b−a222 Et l’erreur maximale (la précision) est b−a 2
y = f (x )y = f (x ) x
y = f (x )y = f (x ) x
y = f (x )y = f (x ) bbb x b
y = f (x )y = f (x ) bbb x b
entrée de l’algorithme : a, b, f,ε ; on suppose que l’utilisateur est intelligent et que on a bien f (b) et f (a) de signes différents (en pratique il faudrait le vérifier) ; tant que l’on a pas atteint la précision souhaité faire : m est le milieu de [a,b], puis si f (m) est de même signe que f (a), alors il y a un zéro est entre m et b, donc je prends a ← m et je recommence ; sinon c’est qu’il y a un zéro est entre a et m et donc je prends b ← m et je recommence ; (il faut gérer le cas improbable mais possible où f (m) = 0) ; J’ai atteint la précision souhaitée : je renvoie l’estimation de x 0 : ( a+b/2)
Si on veut préciser ε : ( par exemple ε = ) 1.def dicho (f, a, b, epsilon = 1e-8): 2. while b-a > 2*epsilon: 3. m = (a + b)/ 2 4. if f(m)==0: 5. return m 6. elif f(a)*f(m) < 0: 7. b = m 8. else : 9. a= m 10. return (a+b)/2
on va effectuer des calculs sur la fonction f(x)=x 2 – 5 et on va appeler cette fonction f. Pour se faciliter la suite, on va créer cette fonction : Def f(x): return x**2-5 Pour résoudre l'équation f(x)=0, on cherche un intervalle sur lequel on est certain que f s'annule. C'est le cas pour [1;3] parce que f(1) est négatif et f(3) est positif. La méthode de dichotomie vise à resserrer un tel intervalle. On constate ci-dessous que la fonction f est traitée comme une entrée de l'algorithme au même titre que les bornes a et b de l'intervalle :
La résolution de l'équation x 2 =0 n'est pas terminée, puisque le script ci-dessus n'a donné qu'une seule des deux solutions de cette équation. Par ailleurs, la solution trouvée n'est affichée qu'à près. def zero (f, a, b): if f(a)*f(b)>0 : print ('pas de solution entre '+str(a)+' et '+str(b)+'!') return 0 while ( abs (a-b)>1e-14): m=(a+b)/2. If f(m)*f(a)>0: a=m else : b=m print ('la solution de f(x)=0 est '+str(m)) return m print (zero(f,1,3))
1.import math 2.def f(x): 3. return x**2-5 4.Def dicho (f,a,b,epsilon) : 5. if (math.fabs(a-b)<=epsilon) : 6. return (a+b)/2 7. else : 8. if f(a)*f((a+b)/2)<=0 : 9. return dicho (a,(a+b)/2,f,epsilon) 10. elif f(b)*f((a+b)/2)<=0 : 11. return dicho (b,(a+b)/2,f,epsilon)