scipy.optimize.elementwise.

find_minimum#

scipy.optimize.elementwise.find_minimum(f, init, /, *, args=(), tolerances=None, maxiter=100, callback=None)[Quelle]#

Findet das Minimum einer unimodalen, reellwertigen Funktion einer reellen Variable.

Für jedes Element der Ausgabe von f sucht find_minimum den skalaren Minimierer, der das Element minimiert. Diese Funktion verwendet derzeit Chandrupatlas Bracketing-Minimierungsalgorithmus [1] und erfordert daher, dass das Argument init eine dreipunktige Minimierungs-Klammer bereitstellt: x1 < x2 < x3 so, dass func(x1) >= func(x2) <= func(x3) gilt, wobei eine der Ungleichungen strikt ist.

Bei einer gültigen Klammer garantiert find_minimum die Konvergenz zu einem lokalen Minimum, das die bereitgestellten tolerances erfüllt, wenn die Funktion innerhalb der Klammer stetig ist.

Diese Funktion arbeitet elementweise, wenn init und args (broadcastable) Arrays enthalten.

Parameter:
faufrufbar

Die Funktion, deren Minimierer gewünscht wird. 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.

find_minimum sucht nach einem Array x, so dass f(x) ein Array von lokalen Minima ist.

init3-Tupel von float array_like

Die Abszissen einer Standard-Skalar-Minimierungs-Klammer. Eine Klammer ist gültig, wenn die Arrays x1, x2, x3 = init x1 < x2 < x3 und func(x1) >= func(x2) <= func(x3) erfüllen, wobei eine der Ungleichungen strikt ist. Arrays müssen miteinander und mit den Arrays von args broadcastbar sein.

argstuple of array_like, optional

Zusätzliche positionale Array-Argumente, die an f übergeben werden. Arrays müssen untereinander und mit den Arrays von init broadcastfähig sein. Wenn die aufgerufene Funktion, für die die Wurzel gesucht wird, Argumente benötigt, die nicht mit x broadcastfähig sind, wrappen Sie diese Funktion mit f, sodass f nur x und broadcastfähige *args akzeptiert.

tolerancesDictionary von Floats, optional

Absolute und relative Toleranzen für die Wurzel und den Funktionswert. Gültige Schlüssel des Wörterbuchs sind

  • xatol - absolute Toleranz für die Wurzel

  • xrtol - relative Toleranz für die Wurzel

  • fatol - absolute Toleranz für den Funktionswert

  • frtol - relative Toleranz für den Funktionswert

Siehe Anmerkungen für Standardwerte und explizite Abbruchbedingungen.

maxiterint, Standard: 100

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

callbackcallable, optional

Eine optionale, vom Benutzer bereitgestellte Funktion, die vor der ersten Iteration und nach jeder Iteration aufgerufen wird. Aufruf als callback(res), wobei res ein _RichResult ist, ähnlich dem, das von find_minimum zurückgegeben wird (aber die aktuellen Werte aller Variablen des Iterationsschritts enthält). Wenn callback eine StopIteration auslöst, wird der Algorithmus sofort beendet und find_root gibt ein Ergebnis zurück. callback darf res oder seine Attribute nicht verändern.

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 konvergierte gegen die angegebenen Toleranzen.

  • -1 : Der Algorithmus stieß auf eine ungültige Klammer.

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

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

  • -4 : Die Iteration wurde durch callback beendet.

  • 1 : Der Algorithmus läuft normal (nur in callback).

xfloat array

Der Minimierer der Funktion, wenn der Algorithmus erfolgreich beendet wurde.

f_xfloat array

Der Wert von f, ausgewertet an x.

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.

bracketTupel von float arrays

Die endgültige dreipunktige Klammer.

f_bracketTupel von float arrays

Der Wert von f, ausgewertet an den Klammerpunkten.

Siehe auch

bracket_minimum

Hinweise

Implementiert basierend auf Chandrupatlas Originalarbeit [1].

Wenn xl < xm < xr die Punkte der Klammer sind und fl >= fm <= fr (wobei eine der Ungleichungen strikt ist) die Werte von f an diesen Punkten sind, dann gilt der Algorithmus als konvergiert, wenn

  • abs(xr - xm)/2 <= abs(xm)*xrtol + xatol oder

  • (fl - 2*fm + fr)/2 <= abs(fm)*frtol + fatol.

Der Standardwert für xrtol ist die Quadratwurzel der Genauigkeit des entsprechenden Datentyps, und xatol = fatol = frtol ist die kleinste normale Zahl des entsprechenden Datentyps.

Referenzen

[1] (1,2)

Chandrupatla, Tirupathi R. (1998). „An efficient quadratic fit-sectioning algorithm for minimization without derivatives“. Computer Methods in Applied Mechanics and Engineering, 152 (1-2), 211-217. https://doi.org/10.1016/S0045-7825(97)00190-4

Beispiele

Angenommen, wir möchten 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, sodass bracket_minium leicht eine Klammer finden wird.

>>> 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_minimum verwendet werden, um eine Schätzung des Minimierers zu erhalten.

>>> res_minimum = elementwise.find_minimum(f, res_bracket.bracket)
>>> res_minimum.x
1.0000000149011612

Der Funktionswert ändert sich innerhalb der Klammer nur um wenige ULPs, daher kann der Minimierer allein durch Auswertung der Funktion nicht wesentlich genauer bestimmt werden (d.h. wir bräuchten seine Ableitung, um bessere Ergebnisse zu erzielen).

>>> import numpy as np
>>> fl, fm, fr = res_minimum.f_bracket
>>> (fl - fm) / np.spacing(fm), (fr - fm) / np.spacing(fm)
(0.0, 2.0)

Daher ist ein präzises Minimum der Funktion gegeben durch

>>> res_minimum.f_x
2.0

bracket_minimum und find_minimum akzeptieren für die meisten Argumente Arrays. Um beispielsweise die Minimierer und Minima für mehrere Werte des Parameters c gleichzeitig zu finden

>>> 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.])