scipy.optimize.elementwise.

bracket_root#

scipy.optimize.elementwise.bracket_root(f, xl0, xr0=None, *, xmin=None, xmax=None, factor=None, args=(), maxiter=1000)[Quelle]#

Klammern Sie die Wurzel einer monotonen, reellwertigen Funktion einer reellen Variablen.

Für jedes Element der Ausgabe von f sucht bracket_root die skalaren Klammerendpunkte xl und xr, so dass sign(f(xl)) == -sign(f(xr)) elementweise gilt.

Die Funktion findet garantiert eine gültige Klammer, wenn die Funktion monoton ist, kann aber auch unter anderen Bedingungen eine Klammer finden.

Diese Funktion arbeitet elementweise, wenn xl0, xr0, xmin, xmax, factor und die Elemente von args (wechselseitig broadcastbare) Arrays sind.

Parameter:
faufrufbar

Die Funktion, deren Wurzel geklammert werden soll. Die Signatur muss lauten

f(x: array, *args) -> array

wobei jedes Element von x eine endliche reelle Zahl ist und args ein Tupel ist, das eine beliebige Anzahl von Arrays enthalten kann, die mit x broadcastfähig sind.

f muss eine elementweise Funktion sein: jedes Element f(x)[i] muss für alle Indizes i gleich f(x[i]) sein. Sie darf das Array x oder die Arrays in args nicht verändern.

xl0, xr0: float array_like

Startschätzung der Klammer, die keine Wurzel enthalten muss. Wenn xr0 nicht angegeben ist, ist xr0 = xl0 + 1. Muss mit allen anderen Array-Eingaben broadcastbar sein.

xmin, xmaxfloat array_like, optional

Mindest- und Höchstgrenzen der Klammer, einschließlich. Müssen mit allen anderen Array-Eingaben broadcastbar sein.

factorfloat array_like, Standard: 2

Der Faktor, der zum Vergrößern der Klammer verwendet wird. Siehe Hinweise.

argstuple of array_like, optional

Zusätzliche positionelle Array-Argumente, die an f übergeben werden. Wenn der aufzurufende Funktionsaufruf Argumente benötigt, die nicht mit x broadcastbar sind, wickeln Sie diesen Aufruf mit f ein, so dass f nur x und broadcastbare *args akzeptiert.

maxiterint, Standard: 1000

Die maximale Anzahl der Algorithmusiterationen, die durchgeführt werden sollen.

Rückgabe:
res_RichResult

Ein Objekt, das einer Instanz von scipy.optimize.OptimizeResult ähnelt, mit den folgenden Attributen. Die Beschreibungen sind so formuliert, als wären die Werte Skalare; wenn f jedoch ein Array zurückgibt, sind die Ausgaben Arrays derselben Form.

successBool-Array

True, wenn der Algorithmus erfolgreich beendet wurde (Status 0); andernfalls False.

statusInteger-Array

Eine Ganzzahl, die den Exit-Status des Algorithmus darstellt.

  • 0 : Der Algorithmus hat eine gültige Klammer erzeugt.

  • -1 : Die Klammer hat sich bis zu den zulässigen Grenzen ausgedehnt, ohne Erfolg.

  • -2 : Die maximale Anzahl von Iterationen wurde erreicht.

  • -3 : Ein nicht-endlicher Wert wurde angetroffen.

  • -4 : Die Iteration wurde durch callback beendet.

  • -5: Die Anfangsklammer erfüllt nicht `xmin <= xl0 < xr0 < xmax`.

bracket2-Tupel aus Float-Arrays

Die untere und obere Endpunkte der Klammer, wenn der Algorithmus erfolgreich beendet wurde.

f_bracket2-Tupel aus Float-Arrays

Die Werte von f, ausgewertet an den Endpunkten von res.bracket, jeweils.

nfevInteger-Array

Die Anzahl der Abszissen, an denen f zur Bestimmung der Wurzel ausgewertet wurde. Dies unterscheidet sich von der Anzahl der Male, die f *aufgerufen* wird, da die Funktion in einem einzigen Aufruf an mehreren Punkten ausgewertet werden kann.

nitint array

Die Anzahl der Iterationen des Algorithmus, die durchgeführt wurden.

Siehe auch

find_root

Hinweise

Diese Funktion verallgemeinert einen Algorithmus, der in Teilen im Code von scipy.stats zu finden ist. Die Strategie besteht darin, die Klammer (l, r) iterativ zu vergrößern, bis f(l) < 0 < f(r) oder f(r) < 0 < f(l) gilt. Die Klammer vergrößert sich nach links wie folgt.

  • Wenn xmin nicht angegeben ist, wird der Abstand zwischen xl0 und l iterativ um factor vergrößert.

  • Wenn xmin angegeben ist, wird der Abstand zwischen xmin und l iterativ um factor verringert. Beachten Sie, dass dadurch auch die Klammergröße *vergrößert* wird.

Das Wachstum der Klammer nach rechts ist analog.

Das Wachstum der Klammer in einer Richtung stoppt, wenn der Endpunkt nicht mehr endlich ist, der Funktionswert am Endpunkt nicht mehr endlich ist oder der Endpunkt seinen Grenzwerte erreicht (xmin oder xmax). Die Iteration endet, wenn die Klammer in beiden Richtungen nicht mehr wächst, die Klammer die Wurzel umschließt oder eine Wurzel gefunden wird (zufällig).

Wenn zwei Klammern gefunden werden – das heißt, in derselben Iteration wird auf beiden Seiten eine Klammer gefunden –, wird die kleinere der beiden zurückgegeben.

Wenn Wurzeln der Funktion gefunden werden, werden sowohl xl als auch xr auf die linkeste Wurzel gesetzt.

Beispiele

Angenommen, wir möchten die Wurzel der folgenden Funktion finden.

>>> def f(x, c=5):
...     return x**3 - 2*x - c

Zuerst müssen wir eine gültige Klammer finden. Die Funktion ist nicht monoton, aber bracket_root kann möglicherweise eine Klammer liefern.

>>> from scipy.optimize import elementwise
>>> res_bracket = elementwise.bracket_root(f, 0)
>>> res_bracket.success
True
>>> res_bracket.bracket
(2.0, 4.0)

Tatsächlich haben die Werte der Funktion an den Klammerendpunkten entgegengesetzte Vorzeichen.

>>> res_bracket.f_bracket
(-1.0, 51.0)

Sobald wir eine gültige Klammer haben, kann find_root verwendet werden, um eine präzise Wurzel zu liefern.

>>> res_root = elementwise.find_root(f, res_bracket.bracket)
>>> res_root.x
2.0945514815423265

bracket_root und find_root akzeptieren für die meisten Argumente Arrays. Um beispielsweise gleichzeitig die Wurzel für einige Werte des Parameters c zu finden

>>> import numpy as np
>>> c = np.asarray([3, 4, 5])
>>> res_bracket = elementwise.bracket_root(f, 0, args=(c,))
>>> res_bracket.bracket
(array([1., 1., 2.]), array([2., 2., 4.]))
>>> res_root = elementwise.find_root(f, res_bracket.bracket, args=(c,))
>>> res_root.x
array([1.8932892 , 2.        , 2.09455148])