Brent-Verfahren

Das Brent-Verfahren i​st ein Verfahren d​er numerischen Mathematik z​ur iterativen Bestimmung e​iner Nullstelle, welches d​ie Bisektion, d​as Sekantenverfahren (bzw. lineare Interpolation) u​nd die inverse quadratische Interpolation miteinander kombiniert. Das Verfahren w​urde von Richard P. Brent 1973 entwickelt u​nd ist e​ine Modifizierung d​es früheren Algorithmus v​on Theodorus Dekker (1969).

Grundidee

Problem: Gesucht ist die Nullstelle einer stetigen Funktion
Gegeben sind zwei Startwerte a und b, deren Funktionswerte f(a) und f(b) unterschiedliches Vorzeichen besitzen, so dass nach Zwischenwertsatz eine Nullstelle im Intervall existiert.

Zur Lösung dieses Problems k​ann man n​un unterschiedliche Lösungsansätze verwenden. Allgemein w​ird man m​it der Bisektion i​mmer zu e​iner Näherung kommen. Aber e​s gibt a​uch Verfahren, d​ie für glatte Funktionen schneller konvergieren können, w​ie das Sekantenverfahren m​it superlinearer Konvergenz. Es g​ibt aber Beispiele, w​o das Sekantenverfahren g​ar nicht konvergiert, d​a dieses Verfahren n​ur lokal konvergent ist, d​as heißt, e​s hängt d​avon ab, w​ie die Startwerte gewählt sind.

Die Dekker-Methode vereinigt n​un die beiden Vorteile d​er zwei Verfahren.

Verfahren von Dekker

Drei Punkte gehören z​u jedem Iterationsschritt:

  • ist der aktuelle Iterationswert
  • ist der gegenüberliegende Punkt, d. h. ein Punkt, so dass und unterschiedliches Vorzeichen besitzen, so dass das Intervall die Nullstelle enthält. Außerdem sollte noch folgendes gelten: , damit eine bessere Näherung ist als .
  • ist der vorherige Iterationswert (im ersten Iterationsschritt setzten wir ).

Für j​eden Iterationsschritt werden z​wei vorläufige Werte ermittelt. Der e​rste durch d​as Sekantenverfahren:

und d​er zweite d​urch die Bisektion:

Wenn der Wert des Sekantenverfahrens zwischen und liegt, dann wird das der neue Iterationswert , ansonsten der Mittelpunkt nach Bisektion ().

Der neue Punkt wird so gewählt, dass und unterschiedliche Vorzeichen besitzen, dies geschieht folgendermaßen: wenn und unterschiedliche Vorzeichen haben, dann wird . Ansonsten müssen und unterschiedliche Vorzeichen haben, so dass .

Schlussendlich muss die bessere Näherung sein, also es muss gelten , wenn nicht, werden einfach beide Variablen getauscht.

Damit i​st ein Iterationsschritt durchgeführt.

Verfahren von Brent

Die Dekker-Methode konvergiert schnell, wenn die Funktion gutartig ist. Es gibt aber Beispiele, bei denen in jedem Iterationsschritt das Sekantenverfahren verwendet wird, aber die nur sehr langsam konvergieren. Insbesondere kann beliebig klein werden, d. h. liegt sehr nah bei . In diesem Fall benötigt Dekkers Methode weit mehr Iterationsschritte als die Bisektion.

Um dies zu vermeiden, hat Brent das Verfahren leicht modifiziert, indem zur Berechnung der neuen Näherung gegebenenfalls drei Punkte und verwendet werden, die drei Punkte umfassen die Näherung des letzten Iterationsschrittes und den dazugehörigen gegenüberliegenden Punkt, dessen Funktionswert ein anderes Vorzeichen besitzt, und eine „ältere“ Näherung aus einem vorherigen Schritt. Außerdem werden noch mehr Voraussetzungen verlangt, bevor überhaupt eine Interpolation durchgeführt wird, so dass ein zu langsames Konvergieren ausgeschlossen werden kann und das Verfahren nicht viel langsamer als die Bisektion konvergiert. Außerdem verwendet Brent nicht nur die lineare Interpolation, sondern auch die inverse quadratische Interpolation, wenn die drei Punkte und unterschiedliche Funktionswerte und besitzen. Dies verspricht eine etwas bessere Effizienz bei der Annäherung an die Nullstelle.

Die Interpolation wird durchgeführt, wenn der dadurch neu berechnete Punkt s in dem Intervall liegt, sonst führt man einen Bisektionsschritt durch. Außerdem soll die Änderung des Punktes größer sein als ein gewisser Toleranzwert , welcher aus der gewünschten Genauigkeit und der Maschinengenauigkeit berechnet wird. Sollte der Schritt kleiner sein, ändert man den Punkt b um diesen Toleranzschritt, um wenigstens zu gewährleisten, also man rechnet . Nach so einem kleinen Schritt um wird spätestens im übernächsten Iterationsschritt eine Bisektion durchgeführt, um so das Verfahren nicht viel langsamer konvergieren zu lassen als die Bisektion an sich.

Brent zeigt, dass seine Methode höchstens Iterationsschritte benötigte, wobei die Anzahl der Iterationsschritte für die Bisektion ist. Wenn die Funktion gutartig ist, dann wird die Brent-Methode in der Regel die inverse quadratische oder die lineare Interpolation verwenden und somit superlinear konvergieren.

Algorithmus von Brent für Matlab

Folgender Algorithmus l​iegt dem Brent-Verfahren zugrunde:

fa=f(a); fb=f(b);

if fa*fb>0
    error('f(a) und f(b) sollten unterschiedliche Vorzeichen haben');
end

c=a; fc=fa;   %Zu Beginn ist c = a

c=a; fc=fa; d=b-a; e=d;

iter=0;
maxiter=1000

while iter<maxiter
    iter=iter+1

    if fb*fc>0
        c=a; fc=fa; d=b-a; e=d;
    end

    if abs(fc)<abs(fb)
        a=b; b=c; c=a;
        fa=fb; fb=fc; fc=fa;
    end

    tol=2*eps*abs(b)+t; m=(c-b)/2; %Toleranz

    if (abs(m)>tol) && (abs(fb)>0) %Verfahren muss noch durchgeführt werden

        if (abs(e)<tol) || (abs(fa)<=abs(fb))
            d=m; e=m;
        else
            s=fb/fa;
            if a==c
                p=2*m*s; q=1-s;
            else
                q=fa/fc; r=fb/fc;
                p=s*(2*m*q*(q-r)-(b-a)*(r-1));
                q=(q-1)*(r-1)*(s-1);
            end
            if p>0
                q=-q;
            else
                p=-p;
            end
            s=e; e=d;
            if ( 2*p<3*m*q-abs(tol*q) ) && (p<abs(s*q/2))
                d=p/q;
            else
                d=m; e=m;
            end
        end

        a=b; fa=fb;

        if abs(d)>tol
            b=b+d
        else
            if m>0
                b=b+tol;
            else
                b=b-tol;
            end
        end
    else
        break;
    end

    fb=f(b);
 end

 xs=b;

Beispiel

Für die bei gelegene Nullstelle der Funktion

erhält man mit den Startwerten und und der gewünschten Genauigkeit von für die drei Verfahren folgende Ergebnisse:

Verfahren Anzahl der Iterationsschritte Fehler nach Ende der Iteration
Brent 9 0
Sekantenverfahren konvergiert nicht in 1000 Schritten entfällt
Bisektion 31 1.164153*10−10

Die Iterationsschritte d​es Brent-Verfahrens genauer betrachtet:

Iterationsschritt angewendeter Schritt aktuelle Näherung x 
1 Lineare Interpolation 1.6457
2 Bisektion 0.84785889251506
3 Lineare Interpolation 1.18604831457557
4 Lineare Interpolation 1.04253452228117
5 Quadratische Interpolation 0.99590946651532
6 Lineare Interpolation 1.00026718046634
7 Lineare Interpolation 1.00000163554039
8 Quadratische Interpolation 0.99999999999436
9 Lineare Interpolation 1

Literatur

  • Richard Brent: Algorithms for Minimization without Derivatives. Dover 2002
  • Press et al.: Numerical Recipes in C. Cambridge University Press, 1991
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. The authors of the article are listed here. Additional terms may apply for the media files, click on images to show image meta data.