scipy.optimize.

brenth#

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

Findet eine Wurzel einer Funktion in einem klammernden Intervall mit Brents Methode mit hyperbolischer Extrapolation.

Eine Variante der klassischen Brent-Routine zur Suche nach einer Wurzel der Funktion f zwischen den Argumenten a und b, die hyperbolische Extrapolation anstelle von inverser quadratischer Extrapolation verwendet. Bus & Dekker (1975) garantieren die Konvergenz für diese Methode und behaupten, dass die Obergrenze der Funktionsauswertungen hier 4- bis 5-mal höher ist als bei der Bisektion. f(a) und f(b) dürfen keine gleichen Vorzeichen haben. Im Allgemeinen ist sie mit der Brent-Routine vergleichbar, aber nicht so intensiv getestet. Es ist eine sichere Version der Sekantenmethode, die hyperbolische Extrapolation verwendet. Die hier verwendete Version stammt von Chuck Harris und implementiert Algorithmus M von [BusAndDekker1975], wo weitere Details (Konvergenzeigenschaften, zusätzliche Anmerkungen usw.) zu finden sind.

Parameter:
fFunktion

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

aSkalar

Ein Ende des klammernden Intervalls [a,b].

bSkalar

Das andere Ende des klammernden Intervalls [a,b].

xtolZahl, optional

Die berechnete Wurzel x0 erfüllt np.isclose(x, x0, atol=xtol, rtol=rtol), wobei x die exakte Wurzel ist. Der Parameter muss positiv sein. Wie bei brentq erfüllt die Methode für "nette" Funktionen oft die obige Bedingung mit xtol/2 und rtol/2.

rtolZahl, optional

Die berechnete Wurzel x0 erfüllt np.isclose(x, x0, atol=xtol, rtol=rtol), wobei x die exakte Wurzel ist. Der Parameter darf nicht kleiner sein als sein Standardwert von 4*np.finfo(float).eps. Wie bei brentq erfüllt die Methode für "nette" Funktionen oft die obige Bedingung mit xtol/2 und rtol/2.

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

brentq, ridder, bisect, newton

1-D Wurzel-Findung

fixed_point

Skalar-Fixed-Point-Finder

elementweise.find_root

effizienter elementweiser 1-D-Wurzelfinder

Hinweise

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 überraschenden Ergebnissen führen, wenn man erwartet, dass brenth immer Wurzeln mit einer relativen Genauigkeit nahe der Maschinengenauigkeit berechnet. Es ist Vorsicht geboten bei der Auswahl von xtol für den jeweiligen Anwendungsfall. Wenn xtol=5e-324 gesetzt wird, der kleinsten Subnormalzahl, wird die höchste Genauigkeit gewährleistet. Größere Werte für 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 zwischen Gleitkommazahlen nahe Null nicht aussagekräftig sind.

Referenzen

[BusAndDekker1975]

Bus, J. C. P., Dekker, T. J., „Two Efficient Algorithms with Guaranteed Convergence for Finding a Zero of a Function“, ACM Transactions on Mathematical Software, Vol. 1, Issue 4, Dez. 1975, S. 330-345. Abschnitt 3: „Algorithmus M“. DOI:10.1145/355656.355659

Beispiele

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