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, wobeif(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
x0wirdnp.isclose(x, x0, atol=xtol, rtol=rtol)erfüllen, wobeixdie exakte Wurzel ist. Der Parameter muss positiv sein.- rtolSkalar, optional
Die berechnete Wurzel
x0wirdnp.isclose(x, x0, atol=xtol, rtol=rtol)erfüllen, wobeixdie 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 einRootResults-Objekt ist.- dispbool, optional
Wenn True, wird RuntimeError ausgelöst, wenn der Algorithmus nicht konvergiert hat. Andernfalls wird der Konvergenzstatus im Rückgabeobjekt
RootResultsaufgezeichnet.
- Rückgabe:
- rootfloat
Ungefähre Wurzel von f
- r
RootResults(vorhanden, wennfull_output = True) Objekt, das Informationen über die Konvergenz enthält. Insbesondere ist
r.convergedTrue, wenn die Routine konvergiert hat.
Siehe auch
Hinweise
f muss stetig sein. Algorithmus 748 mit
k=2ist 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=1ist die Konvergenzordnung mindestens 2,7, und mit etwa asymptotisch 2 Funktionsauswertungen pro Iteration beträgt der Effizienzindex ungefähr 1,65. Fürk=2beträ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 sindk=1oderk=2normalerweise geeignet.Wie in der Parameterdokumentation erwähnt, wird die berechnete Wurzel
x0np.isclose(x, x0, atol=xtol, rtol=rtol)erfüllen, wobeixdie exakte Wurzel ist. In Gleichungsform ist diese Abbruchbedingungabs(x - x0) <= xtol + rtol * abs(x0).Der Standardwert
xtol=2e-12kann zu überraschendem Verhalten führen, wenn man erwartet, dasstoms748immer 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 vonxtol=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