- Méthode de brent
-
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 robuste méthode de dichotomie si besoin est. Cela donne une méthode alliant robustesse et rapidité, qui se trouve être très populaire et très appréciée. L'idée d'allier ces méthodes différentes est due à Theodorus Dekker (1969) et à Richard Brent (1973).
Sommaire
La 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, disons a0 et b0, tels que f(a0) et f(b0) aient des 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.-à-d. l'approximation courante de la racine de f;
- ak est le "contrepoint," c.-à-d. un point tel que f(ak) et f(bk) aient des signes opposés. Ainsi, l'intervalle [ak, bk] contient à coups sûr la solution. De plus, |f(bk)| doit être plus petit (en magnitude) 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 b−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 choisi de tel sorte que f(ak+1) et f(bk+1) aient des signes opposés. Si f(ak) et f(bk+1) sont de signe opposé, alors le contrepoint ne change pas: ak+1 = ak. Sinon, f(bk+1) et f(bk) sont de signe opposé 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.
La 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ée 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 inverses 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).
- 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 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, et un pointeur vers une sous-routine pour f
- 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
- répéter jusqu'à ce que f(b) = 0 ou |b − a| soit suffisamment petit (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 répéte
- sortir b (renvoie de la racine)
Implémentations
Brent (1973) a publié une implémentation en Algol 60. La librairie Netlib contient une implémentation en Fortran. 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.
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.
- 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. SBN 471-28300-9.
Liens externes
- zeroin.f sur Netlib.
- Module for Brent's Method par John H. Mathews
- Portail des mathématiques
Catégorie : Algorithme de recherche d'un zéro d'une fonction
Wikimedia Foundation. 2010.