scipy.optimize.

brentq#

scipy.optimize.brentq(f, a, b, args=(), xtol=2e-12, rtol=np.float64(8.881784197001252e-16), maxiter=100, full_output=False, disp=True)[Quelle]#

Eine Wurzel einer Funktion in einem Klammerintervall mit Brents Methode finden.

Verwendet die klassische Brentsche Methode, um eine Wurzel der Funktion f im vorzeichenwechselnden Intervall [a , b] zu finden. Gilt allgemein als die beste der hier aufgeführten Wurzelauffindungsroutinen. Es ist eine sichere Version der Sekantenmethode, die die inverse quadratische Extrapolation verwendet. Brents Methode kombiniert Wurzelklammerung, Intervallhalbierung und inverse quadratische Interpolation. Sie ist manchmal auch als Van-Wijngaarden-Dekker-Brent-Methode bekannt. Brent (1973) behauptet, dass die Konvergenz für im Intervall [a,b] berechenbare Funktionen garantiert ist.

[Brent1973] liefert die klassische Beschreibung des Algorithmus. Eine weitere Beschreibung findet sich in einer neueren Ausgabe von Numerical Recipes, einschließlich [PressEtal1992]. Eine dritte Beschreibung ist unter http://mathworld.wolfram.com/BrentsMethod.html zu finden. Der Algorithmus sollte allein durch Lesen unseres Codes leicht verständlich sein. Unser Code weicht von den Standarddarstellungen ab: Wir wählen eine andere Formel für den Extrapolationsschritt.

Parameter:
fFunktion

Python-Funktion, die eine Zahl zurückgibt. Die Funktion \(f\) muss kontinuierlich sein, und \(f(a)\) und \(f(b)\) müssen entgegengesetzte Vorzeichen haben.

aSkalar

Ein Ende des Klammerintervalls \([a, b]\).

bSkalar

Das andere Ende des Klammerintervalls \([a, b]\).

xtolZahl, optional

Die berechnete Wurzel x0 wird die Bedingung np.isclose(x, x0, atol=xtol, rtol=rtol) erfüllen, wobei x die exakte Wurzel ist. Der Parameter muss positiv sein. Bei "schönen" Funktionen wird die Brentsche Methode oft die obige Bedingung mit xtol/2 und rtol/2 erfüllen. [Brent1973]

rtolZahl, optional

Die berechnete Wurzel x0 wird die Bedingung np.isclose(x, x0, atol=xtol, rtol=rtol) erfüllen, wobei x die exakte Wurzel ist. Der Parameter darf nicht kleiner sein als sein Standardwert von 4*np.finfo(float).eps. Bei "schönen" Funktionen wird die Brentsche Methode oft die obige Bedingung mit xtol/2 und rtol/2 erfüllen. [Brent1973]

maxiterint, optional

Wenn die Konvergenz nicht in maxiter Iterationen erreicht wird, wird ein Fehler ausgelöst. Muss >= 0 sein.

argstuple, optional

Enthält zusätzliche Argumente für die Funktion f. f wird mit apply(f, (x)+args) aufgerufen.

full_outputbool, optional

Wenn full_output False ist, wird die Wurzel zurückgegeben. Wenn full_output True ist, ist der Rückgabewert (x, r), wobei x die Wurzel ist und r ein RootResults-Objekt ist.

dispbool, optional

Wenn True, wird ein RuntimeError ausgelöst, wenn der Algorithmus nicht konvergiert. Andernfalls wird der Konvergenzstatus in einem beliebigen RootResults-Rückgabeobjekt aufgezeichnet.

Rückgabe:
rootfloat

Wurzel von f zwischen a und b.

rRootResults (vorhanden, wenn full_output = True)

Objekt, das Informationen über die Konvergenz enthält. Insbesondere ist r.converged True, wenn die Routine konvergiert hat.

Siehe auch

fmin, fmin_powell, fmin_cg, fmin_bfgs, fmin_ncg

multivariate lokale Optimierer

leastsq

nichtlineare Kleinste-Quadrate-Minimierer

fmin_l_bfgs_b, fmin_tnc, fmin_cobyla

beschränkte multivariate Optimierer

basinhopping, differential_evolution, brute

globale Optimierer

fminbound, brent, golden, bracket

lokale Skalar-Minimierer

fsolve

N-D Wurzel-Findung

brenth, ridder, bisect, newton

1-D Wurzel-Findung

fixed_point

Skalar-Fixed-Point-Finder

elementweise.find_root

effizienter elementweiser 1-D-Wurzelfinder

Hinweise

f muss kontinuierlich sein. f(a) und f(b) müssen entgegengesetzte Vorzeichen haben.

Wie in der Parameterdokumentation erwähnt, wird die berechnete Wurzel x0 np.isclose(x, x0, atol=xtol, rtol=rtol) erfüllen, wobei x die exakte Wurzel ist. In Gleichungsform ist diese Abbruchbedingung abs(x - x0) <= xtol + rtol * abs(x0).

Der Standardwert xtol=2e-12 kann zu überraschendem Verhalten führen, wenn man erwartet, dass brentq immer Wurzeln mit einem relativen Fehler nahe der Maschinengenauigkeit berechnet. Es ist Vorsicht geboten, xtol für den jeweiligen Anwendungsfall auszuwählen. Wenn xtol=5e-324 gesetzt wird, die kleinste subnormale Zahl, wird die höchste Genauigkeit gewährleistet. Größere Werte von xtol können nützlich sein, um Funktionsauswertungen zu sparen, wenn eine Wurzel bei oder nahe Null liegt, in Anwendungen, bei denen die winzigen absoluten Unterschiede, die zwischen Gleitkommazahlen nahe Null verfügbar sind, nicht aussagekräftig sind.

Referenzen

[Brent1973] (1,2,3)

Brent, R. P., Algorithms for Minimization Without Derivatives. Englewood Cliffs, NJ: Prentice-Hall, 1973. Kap. 3-4.

[PressEtal1992]

Press, W. H.; Flannery, B. P.; Teukolsky, S. A.; and Vetterling, W. T. Numerical Recipes in FORTRAN: The Art of Scientific Computing, 2nd ed. Cambridge, England: Cambridge University Press, pp. 352-355, 1992. Abschnitt 9.3: „Van Wijngaarden-Dekker-Brent Method.“

Beispiele

>>> def f(x):
...     return (x**2 - 1)
>>> from scipy import optimize
>>> root = optimize.brentq(f, -2, 0)
>>> root
-1.0
>>> root = optimize.brentq(f, 0, 2)
>>> root
1.0