scipy.optimize.

toms748#

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

Findet eine Wurzel mittels der TOMS Algorithm 748 Methode.

Implementiert die Methode des Algorithmus 748 von Alefeld, Potro und Shi, um eine Wurzel der Funktion f im Intervall [a , b] zu finden, wobei f(a) und f(b) entgegengesetzte Vorzeichen haben müssen.

Sie verwendet eine Mischung aus inverser kubischer Interpolation und „Newton-Quadratik“-Schritten. [APS1995].

Parameter:
fFunktion

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

aSkalar,

untere Grenze des Suchintervalls

bSkalar,

obere Grenze des Suchintervalls

argstuple, optional

die zusätzliche Argumente für die Funktion f enthält. f wird von f(x, *args) aufgerufen.

kint, optional

Die Anzahl der Newton-Quadratik-Schritte, die pro Iteration durchgeführt werden. k>=1.

xtolSkalar, optional

Die berechnete Wurzel x0 wird np.isclose(x, x0, atol=xtol, rtol=rtol) erfüllen, wobei x die exakte Wurzel ist. Der Parameter muss positiv sein.

rtolSkalar, optional

Die berechnete Wurzel x0 wird np.isclose(x, x0, atol=xtol, rtol=rtol) erfüllen, wobei x die exakte Wurzel ist.

maxiterint, optional

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

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 RuntimeError ausgelöst, wenn der Algorithmus nicht konvergiert hat. Andernfalls wird der Konvergenzstatus im Rückgabeobjekt RootResults aufgezeichnet.

Rückgabe:
rootfloat

Ungefähre Wurzel von f

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

brentq, brenth, ridder, bisect, newton
fsolve

Findet Wurzeln in N Dimensionen.

elementweise.find_root

effizienter elementweiser 1-D-Wurzelfinder

Hinweise

f muss stetig sein. Algorithmus 748 mit k=2 ist asymptotisch der effizienteste bekannte Algorithmus zur Suche von Wurzeln einer viermal stetig differenzierbaren Funktion. Im Gegensatz zu Brents Algorithmus, der die Länge des umschließenden Intervalls nur im letzten Schritt verringern kann, verringert Algorithmus 748 diese bei jeder Iteration mit der gleichen asymptotischen Effizienz wie bei der Wurzelsuche.

Zur einfachen Angabe von Effizienzindizes wird angenommen, dass f 4 stetige Ableitungen hat. Für k=1 ist die Konvergenzordnung mindestens 2,7, und mit etwa asymptotisch 2 Funktionsauswertungen pro Iteration beträgt der Effizienzindex ungefähr 1,65. Für k=2 beträgt die Ordnung etwa 4,6 mit asymptotisch 3 Funktionsauswertungen pro Iteration und der Effizienzindex 1,66. Für höhere Werte von k nähert sich der Effizienzindex der k-ten Wurzel von (3k-2) an, daher sind k=1 oder k=2 normalerweise geeignet.

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 toms748 immer Wurzeln mit einem relativen Fehler nahe der Maschinengenauigkeit berechnet. Es ist Vorsicht geboten bei der Auswahl von xtol für den jeweiligen Anwendungsfall. Das Setzen von xtol=5e-324, der kleinsten subnormalen Zahl, gewährleistet die höchste Genauigkeit. 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 zwischen Gleitkommazahlen nahe Null nicht aussagekräftig sind.

Referenzen

[APS1995]

Alefeld, G. E. und Potro, F. A. und Shi, Yixun, Algorithm 748: Enclosing Zeros of Continuous Functions, ACM Trans. Math. Softw. Volume 221(1995) doi = {10.1145/210089.210111}

Beispiele

>>> def f(x):
...     return (x**3 - 1)  # only one real root at x = 1
>>> from scipy import optimize
>>> root, results = optimize.toms748(f, 0, 2, full_output=True)
>>> root
1.0
>>> results
      converged: True
           flag: converged
 function_calls: 11
     iterations: 5
           root: 1.0
         method: toms748