bracket_minimum#
- scipy.optimize.elementwise.bracket_minimum(f, xm0, *, xl0=None, xr0=None, xmin=None, xmax=None, factor=None, args=(), maxiter=1000)[Quelle]#
Klammert das Minimum einer unimodalen, reellwertigen Funktion einer reellen Variablen.
Für jedes Element der Ausgabe von f sucht
bracket_minimumdie skalaren Klammerpunktexl < xm < xr, sodassfl >= fm <= frgilt, wobei eine der Ungleichungen strikt ist.Die Funktion garantiert, eine gültige Klammer zu finden, wenn die Funktion stark unimodal ist, kann aber auch unter anderen Bedingungen eine Klammer finden.
Diese Funktion arbeitet elementweise, wenn xm0, xl0, xr0, xmin, xmax, factor und die Elemente von args (wechselseitig broadcastbare) Arrays sind.
- Parameter:
- faufrufbar
Die Funktion, für die die Wurzel geklammert werden soll. Die Signatur muss lauten:
f(x: array, *args) -> array
wobei jedes Element von
xeine endliche reelle Zahl ist undargsein Tupel ist, das eine beliebige Anzahl von Arrays enthalten kann, die mitxbroadcastfähig sind.f muss eine elementweise Funktion sein: jedes Element
f(x)[i]muss für alle Indizesigleichf(x[i])sein. Sie darf das Arrayxoder die Arrays inargsnicht verändern.- xm0: float array_like
Startschätzung für den mittleren Punkt der Klammer.
- xl0, xr0: float array_like, optional
Startschätzungen für linke und rechte Endpunkte der Klammer. Müssen mit allen anderen Array-Eingaben broadcastbar sein.
- xmin, xmaxfloat array_like, optional
Minimale und maximale zulässige Endpunkte der Klammer, einschließlich. Müssen mit allen anderen Array-Eingaben broadcastbar sein.
- factorfloat array_like, Standardwert: 2
Der Faktor, der zum Erweitern der Klammer verwendet wird. Siehe Hinweise.
- argstuple of array_like, optional
Zusätzliche positionelle Array-Argumente, die an f übergeben werden. Wenn die aufgerufene Funktion, für die die Wurzel gewünscht wird, Argumente benötigt, die nicht mit x broadcastbar sind, wickeln Sie diese aufgerufene Funktion mit f so, dass f nur x und broadcastbare
*argsakzeptiert.- maxiterint, Standardwert: 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 (Status0); andernfallsFalse.- statusInteger-Array
Eine Ganzzahl, die den Exit-Status des Algorithmus darstellt.
0: Der Algorithmus hat eine gültige Klammer erzeugt.-1: Die Klammer erweiterte sich bis zu den zulässigen Grenzen. Unter der Annahme von Unimodalität impliziert dies, dass der Endpunkt an der Grenze ein Minimierer ist.-2: Die maximale Anzahl von Iterationen wurde erreicht.-3: Ein nicht-endlicher Wert wurde angetroffen.-4:Nonesoll bestehen.-5: Die anfängliche Klammer erfüllt nicht xmin <= xl0 < xm0 < xr0 <= xmax.
- bracket3-Tupel aus Float-Arrays
Die linken, mittleren und rechten Punkte der Klammer, wenn der Algorithmus erfolgreich terminiert ist.
- f_bracket3-Tupel aus Float-Arrays
Der Funktionswert an den linken, mittleren und rechten Punkten der Klammer.
- 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.
Hinweise
Ähnlich wie
scipy.optimize.bracketsucht diese Funktion nach reellen Punktenxl < xm < xr, so dassf(xl) >= f(xm)undf(xr) >= f(xm)gilt, wobei mindestens eine der Ungleichungen strikt ist. Im Gegensatz zuscipy.optimize.bracketkann diese Funktion vektorisiert auf Array-Eingaben angewendet werden, solange die Eingabe-Arrays untereinander broadcastbar sind. Anders alsscipy.optimize.bracketkönnen Benutzer auch minimale und maximale Endpunkte für die gewünschte Klammer angeben.Gegeben ein anfängliches Trio von Punkten
xl = xl0,xm = xm0,xr = xr0, prüft der Algorithmus, ob diese Punkte bereits eine gültige Klammer ergeben. Wenn nicht, wird ein neuer Endpunktwin der "absteigenden" Richtung gewählt,xmwird zum neuen gegenüberliegenden Endpunkt und entweder xl oder xr wird zum neuen Mittelpunkt, je nachdem, in welche Richtung es abwärts geht. Der Algorithmus wiederholt dies.Der neue Endpunkt w wird unterschiedlich gewählt, je nachdem, ob eine Grenze xmin oder xmax in der absteigenden Richtung festgelegt wurde. Ohne Verlust der Allgemeinheit nehmen wir an, die absteigende Richtung ist nach rechts, so dass
f(xl) > f(xm) > f(xr). Wenn keine Grenze nach rechts vorhanden ist, wird w alsxr + factor * (xr - xm)gewählt, wobei factor vom Benutzer gesteuert wird (Standard ist 2,0), so dass sich die Schrittgrößen geometrisch proportionieren. Wenn eine Grenze vorhanden ist, in diesem Fall xmax, dann wird w alsxmax - (xmax - xr)/factorgewählt, wobei sich die Schritte bei xmax verlangsamen. Dieser vorsichtige Ansatz stellt sicher, dass ein Minimum nahe, aber von der Grenze verschieden, nicht verpasst wird, und erkennt gleichzeitig, ob die Grenze xmax ein Minimierer ist, wenn xmax nach einer endlichen Anzahl von Schritten erreicht wird.Beispiele
Nehmen wir an, wir wollen die folgende Funktion minimieren.
>>> def f(x, c=1): ... return (x - c)**2 + 2
Zuerst müssen wir eine gültige Klammer finden. Die Funktion ist unimodal, daher findet bracket_minium leicht eine Klammer.
>>> from scipy.optimize import elementwise >>> res_bracket = elementwise.bracket_minimum(f, 0) >>> res_bracket.success True >>> res_bracket.bracket (0.0, 0.5, 1.5)
Tatsächlich sind die Klammerpunkte geordnet und der Funktionswert am mittleren Klammerpunkt ist kleiner als an den umgebenden Punkten.
>>> xl, xm, xr = res_bracket.bracket >>> fl, fm, fr = res_bracket.f_bracket >>> (xl < xm < xr) and (fl > fm <= fr) True
Sobald wir eine gültige Klammer haben, kann
find_minimumverwendet werden, um einen Schätzer des Minimierers zu liefern.>>> res_minimum = elementwise.find_minimum(f, res_bracket.bracket) >>> res_minimum.x 1.0000000149011612
bracket_minimumundfind_minimumakzeptieren Arrays für die meisten Argumente. Zum Beispiel, um die Minimierer und Minima für einige Werte des Parameterscgleichzeitig zu finden>>> import numpy as np >>> c = np.asarray([1, 1.5, 2]) >>> res_bracket = elementwise.bracket_minimum(f, 0, args=(c,)) >>> res_bracket.bracket (array([0. , 0.5, 0.5]), array([0.5, 1.5, 1.5]), array([1.5, 2.5, 2.5])) >>> res_minimum = elementwise.find_minimum(f, res_bracket.bracket, args=(c,)) >>> res_minimum.x array([1.00000001, 1.5 , 2. ]) >>> res_minimum.f_x array([2., 2., 2.])