Méthode de Brent
En analyse numérique, la méthode de Brent est un algorithme de recherche d'un zéro d'une fonction combinant la méthode de dichotomie, la méthode de la sécante et l’interpolation quadratique inverse. À chaque itération, elle décide laquelle de ces trois méthodes est susceptible d’approcher au mieux le zéro, et effectue une itération en utilisant cette méthode. L'idée principale est d'utiliser la méthode de la sécante ou d'interpolation quadratique inverse parce qu'elles convergent vite, et de revenir à la méthode de dichotomie si besoin est. L'idée d'allier ces méthodes différentes est due à Theodorus Dekker (en) (1969) et à Richard Brent (1973).
La méthode de Chandrupatla en est une variante plus simple et qui converge plus rapidement pour les fonctions plates au voisinage de leurs racines[1],[2].
Méthode de Dekker
L'idée de combiner les méthodes de dichotomie et de la sécante remonte à Dekker.
On suppose vouloir résoudre l'équation f(x) = 0. À l'image de la méthode de dichotomie, la méthode de Dekker est initialisée par deux points, notés a0 et b0, tels que f(a0) et f(b0) soient de signes opposés. Si f est continue sur [a0, b0], le théorème des valeurs intermédiaires indique l'existence d'une solution entre a0 et b0.
À chaque itération, trois points entrent en jeu:
- bk est l'itération courante, c'est-à-dire l'approximation courante de la racine de f;
- ak est le contrepoint, c'est-à-dire un point tel que f(ak) et f(bk) soient de signes opposés. Ainsi, l'intervalle [ak ; bk] contient à coup sûr la solution. De plus, |f(bk)| doit être plus petit (en valeur absolue) que |f(ak)|, de telle sorte que bk soit une meilleure approximation de la racine que ak;
- bk−1 est l'itération précédente (pour la première itération, on pose bk-1 = a0).
Deux candidats à la prochaine itération sont calculés: le premier est obtenu par la méthode de la sécante
et le second par la méthode de dichotomie
Si le résultat de la méthode de la sécante, s, tombe entre bk et m, alors il peut devenir le prochain itéré (bk+1 = s), et dans le cas contraire, le point milieu entre en jeu (bk+1 = m).
Alors, la valeur du nouveau contrepoint est choisie de telle sorte que f(ak+1) et f(bk+1) soient de signes opposés. Si f(ak) et f(bk+1) sont de signes opposés, alors le contrepoint ne change pas : ak+1 = ak. Sinon, f(bk+1) et f(bk) sont de signes opposés et le nouveau contrepoint devient ak+1 = bk.
Finalement, si |f(ak+1)| < |f(bk+1)|, alors ak+1 est probablement une meilleure approximation de la solution que bk+1, et par suite, les valeurs de ak+1 et bk+1 sont échangées.
En arrivant à ce point, la méthode vient de réaliser une itération. La méthode est répétée jusqu'à convergence.
Méthode de Brent
La méthode de Dekker est efficace si f se comporte raisonnablement bien. Toutefois, dans certaines circonstances, chaque itération emploie la méthode de la sécante mais la suite des bk converge très lentement (en particulier, |bk − bk−1| peut devenir arbitrairement petit). Dans une telle configuration, la méthode de Dekker nécessite alors plus d'itérations que la méthode de dichotomie.
Brent propose une petite modification pour éviter ce problème: un test supplémentaire doit être vérifié avant que le résultat de la méthode de la sécante soit accepté comme la prochaine itération. En particulier, si l'étape précédente utilisait la méthode de dichotomie, l'inégalité
doit être vraie, sinon le point milieu m devient le prochain itéré. Si l'étape précédente utilisait l'interpolation, alors l'inégalité
est utilisée à la place. Cette modification permet de remplacer la méthode de la sécante par la méthode de dichotomie lorsque la première progresse trop lentement. Brent a prouvé que cette méthode requiert au plus N2 itérations, où N représente le nombre d'itérations pour la méthode de dichotomie. Si la fonction f se comporte bien, la méthode de Brent utilise au choix l'interpolation quadratique inverse ou l'interpolation linéaire, auquel cas la vitesse de convergence est superlinéaire.
La méthode de Brent se base sur l'interpolation quadratique inverse plutôt que l'interpolation linéaire (qui apparaît dans la méthode de la sécante) si f(bk), f(ak) et f(bk−1) sont distincts. Ceci améliore significativement l'efficacité. Par conséquent, la condition pour accepter la valeur d'interpolation s est modifiée: s doit tomber entre (3ak + bk) / 4 et bk.
Exemple
On cherche à identifier une racine de f(x) = (x + 3)(x − 1)2. On prend [a0; b0] = [−4; 4/3] comme intervalle initial. On a f(a0) = −25 et f(b0) = 0,48148 (tous les nombres de cette section sont tronqués); ainsi les conditions f(a0) f(b0) < 0 et |f(b0)| ≤ |f(a0)| sont vérifiées. Nous allons détailler l'utilisation de Brent, qui utilise soit l'interpolation linéaire (abrégée en IL) soit l'interpolation quadratique inverse (IQI).
![](http://upload.wikimedia.org/wikipedia/commons/thumb/e/ec/Brent_method_example.png/220px-Brent_method_example.png)
- Dans la première itération, on utilise une IL entre (b−1; f(b−1)) = (a0; f(a0)) = (−4; −25) et (b0; f(b0)) = (1,33333; 0,48148), ce qui conduit à s = 1,23256. Cette valeur tombe entre (3a0 + b0) / 4 et b0 et, par conséquent, cette valeur est acceptée. En outre, f(1,23256) = 0,22891, ce qui donne a1 = a0 et b1 = s = 1,23256;
- Dans la deuxième itération, une IQI entre (a1; f(a1)) = (−4; −25) et (b0; f(b0)) = (1,33333; 0,48148) et (b1; f(b1)) = (1,23256; 0,22891) donne 1,14205; cette valeur est entre (3a1 + b1) / 4 et b1. De plus, l'inégalité |1,14205 − b1| ≤ |b0 − b−1| / 2 est satisfaite; cette valeur est donc retenue. Enfin, comme f(1,14205) = 0,083582, on pose a2 = a1 et b2 = 1,14205;
- Dans la troisième itération, on utilise une IQI entre (a2; f(a2)) = (−4; −25) et (b1; f(b1)) = (1,23256; 0,22891) et (b2; f(b2)) = (1,14205; 0,083582), ce qui donne 1,09032. Cette valeur est entre (3a2 + b2) / 4 et b2;mais la condition supplémentaire de Brent bloque: en effet, l'inégalité |1,09032 − b2| ≤ |b1 − b0| / 2 n'est pas vérifiée: la valeur en cours est donc rejetée. À la place, on calcule le point milieu de l'intervalle [a2; b2]: m = −1,42897. On a f(m) = 9,26891; on pose alors a3 = a2 et b3 = −1,42897;
- Dans la quatrième itération, la valeur −1,15448 est obtenue par IQI entre (a3; f(a3)) = (−4; −25) et (b2; f(b2)) = (1,14205; 0,083582) et enfin (b3; f(b3)) = (−1,42897; 9,26891). Cette valeur ne tombe pas entre (3a3 + b3) / 4 et b3). Par conséquent, on calcule à la place le milieu m = −2,71449; on a f(m) = 3,9393. On pose finalement a4 = a3 et b4 = −2,71449;
- Dans la cinquième itération, une IQI donne −3,45500, qui tombe dans l'intervalle requis. Toutefois, l'itération précédente était une étape de dichotomie et l'inégalité |−3,45500 − b4| ≤ |b4 − b3| / 2 doit être satisfaite, ce qui n'est pas le cas. On utilise alors le point milieu m = −3,35724, pour lequel f(m) = −6,78239. Ainsi, m devient le nouveau contrepoint: a5 = −3,35724 et b5 = b4;
- Dans la sixième itération, l'IQI est interdite car b5 = b4. Par conséquent, on la remplace par une IL entre (a5; f(a5)) = (−3,35724; −6,78239) et (b5; f(b5)) = (−2,71449; 3,93934). Il en résulte s = −2,95064, qui satisfait toutes les conditions. On calcule f(s) = 0,77032 et on pose a6 = a5 et b6 = −2,95064;
- Dans la septième itération, on utilise encore une IQI ce qui donne s = −3,00219, qui vérifie toutes les conditions. Maintenant, f(s) = −0,03515, et on pose donc a7 = b6 et b7 = −3,00219 (a7 et b7 sont échangés afin que |f(b7)| ≤ |f(a7)| soit vraie);
- Dans la huitième itération, on ne peut considérer une IQI parce que a7 = b6. L'IL donne à la place s = −2,99994, valeur qui est acceptée;
- Dans les itérations suivantes, la racine x = −3 est approchée rapidement: b9 = −3 + 6 × 10−8 et b10 = −3 – 3 × 10−15.
Algorithme
- Entrée de a, b, un pointeur vers une sous-routine pour f, e une précision désirée
- calculer f(a)
- calculer f(b)
- si f(a) f(b) >= 0 alors sortie (erreur) fin si
- si |f(a)| < |f(b)| alors échanger (a,b) fin si
- c := a
- mflag := vrai
- tant que f(b) != 0 ou |b − a|>e (condition de convergence)
- si f(a) ≠ f(c) et f(b) ≠ f(c) alors
- (interpolation quadratique inverse)
- sinon
- (règle de la sécante)
- fin si
- si s n'est pas entre (3a + b)/4 et b ou (mflag est vrai et |s−b| ≥ |b−c| / 2) ou (mflag est faux et |s−b| ≥ |c−d| / 2) alors
- mflag := vrai
- sinon
- mflag := faux
- fin si
- calculer f(s)
- d := c
- c := b
- si f(a) f(s) < 0 alors b := s sinon a := s fin si
- si |f(a)| < |f(b)| alors échange (a,b) fin si
- si f(a) ≠ f(c) et f(b) ≠ f(c) alors
- fin tant que
- sortir b (renvoi de la racine)
Implémentations
Brent (1973) a publié une implémentation en Algol 60. La bibliothèque Netlib contient une implémentation en Fortran[3]. La fonction MATLAB nommée fzero
ou la fonction solve
de PARI/GP sont d'autres exemples d'implémentation de la méthode de Brent.
Voir aussi
Notes et références
- (en) Cet article est partiellement ou en totalité issu de l’article de Wikipédia en anglais intitulé « Brent's method » (voir la liste des auteurs).
Bibliographie
- Atkinson (1989). An Introduction to Numerical Analysis (2nd ed.), Section 2.8. John Wiley and Sons (ISBN 0-471-50023-2)
- R.P. Brent (1973). Algorithms for Minimization without Derivatives, Chapter 4. Prentice-Hall, Englewood Cliffs, NJ (ISBN 0-13-022335-2). L'édition originale est disponible sur la page professionnelle de l'auteur à l'Université nationale australienne.
- T.J. Dekker (1969). "Finding a zero by means of successive linear interpolation." In B. Dejon and P. Henrici (eds), Constructive Aspects of the Fundamental Theorem of Algebra, Wiley-Interscience, London. (ISBN 0471-20300-9)
Liens externes
- (en) Module for Brent's Method par John H. Mathews
- La bibliothèque « cpp_brent »(Archive.org • Wikiwix • Archive.is • Google • Que faire ?) contient une implémentation en C++.
Articles connexes
Méthode de Powell (en), une variante de la méthode de Brent permettant la recherche d'un minimum d'une fonction
v · m Méthodes de résolution d'équations | |
---|---|
Équations polynomiales | |
Recherche d'un zéro |
Portail de l'analyse