scipy.optimize.

newton_krylov#

scipy.optimize.newton_krylov(F, xin, iter=None, rdiff=None, method='lgmres', inner_maxiter=20, inner_M=None, outer_k=10, verbose=False, maxiter=None, f_tol=None, f_rtol=None, x_tol=None, x_rtol=None, tol_norm=None, line_search='armijo', callback=None, **kw)#

Findet eine Wurzel einer Funktion mithilfe einer Krylov-Approximation für die inverse Jacobi-Matrix.

Diese Methode eignet sich für die Lösung von Problemen mit großer Dimension.

Parameter:
FFunktion(x) -> f

Funktion, deren Nullstelle gefunden werden soll; sollte ein Array-ähnliches Objekt entgegennehmen und zurückgeben.

xinarray_like

Erster Schätzwert für die Lösung

rdifffloat, optional

Relativer Schrittgrößenwert für die numerische Differenzierung.

methodstr oder aufrufbar, optional

Krylov-Methode zur Annäherung der Jacobi-Matrix. Kann ein String oder eine Funktion sein, die die gleiche Schnittstelle wie die iterativen Löser in scipy.sparse.linalg implementiert. Wenn es sich um einen String handelt, muss er einer der folgenden sein: 'lgmres', 'gmres', 'bicgstab', 'cgs', 'minres', 'tfqmr'.

Der Standardwert ist scipy.sparse.linalg.lgmres.

inner_maxiterint, optional

Parameter, der an den „inneren“ Krylov-Löser übergeben wird: maximale Anzahl von Iterationen. Die Iteration wird nach maxiter Schritten beendet, auch wenn die angegebene Toleranz noch nicht erreicht wurde.

inner_MLinearOperator oder InverseJacobian

Vorkonditionierer für die innere Krylov-Iteration. Beachten Sie, dass Sie auch inverse Jacobi-Matrizen als (adaptive) Vorkonditionierer verwenden können. Zum Beispiel,

>>> from scipy.optimize import BroydenFirst, KrylovJacobian
>>> from scipy.optimize import InverseJacobian
>>> jac = BroydenFirst()
>>> kjac = KrylovJacobian(inner_M=InverseJacobian(jac))

Wenn der Vorkonditionierer eine Methode namens „update“ hat, wird diese nach jedem nichtlinearen Schritt mit update(x, f) aufgerufen, wobei x den aktuellen Punkt und f den aktuellen Funktionswert angibt.

outer_kint, optional

Größe des Unterraums, der über die nichtlinearen LGMRES-Iterationen beibehalten wird. Weitere Details finden Sie unter scipy.sparse.linalg.lgmres.

inner_kwargskwargs

Schlüsselwortargumente für den „inneren“ Krylov-Löser (definiert mit method). Parameternamen müssen mit dem Präfix inner_ beginnen, das vor der Übergabe an die innere Methode gestrichen wird. Siehe z. B. scipy.sparse.linalg.gmres für Details.

iterint, optional

Anzahl der durchzuführenden Iterationen. Wenn weggelassen (Standard), werden so viele Iterationen durchgeführt, wie zur Erfüllung der Toleranzen erforderlich sind.

verbosebool, optional

Gibt bei jeder Iteration den Status auf stdout aus.

maxiterint, optional

Maximale Anzahl von Iterationen. Wenn mehr benötigt werden, um die Konvergenz zu erreichen, wird NoConvergence ausgelöst.

f_tolfloat, optional

Absolute Toleranz (in der Maximalnorm) für das Residuum. Wenn weggelassen, beträgt der Standardwert 6e-6.

f_rtolfloat, optional

Relative Toleranz für das Residuum. Wenn weggelassen, wird sie nicht verwendet.

x_tolfloat, optional

Absolute minimale Schrittweite, wie sie aus der Jacobi-Approximation bestimmt wird. Wenn die Schrittweite kleiner ist als dieser Wert, wird die Optimierung als erfolgreich beendet. Wenn weggelassen, wird sie nicht verwendet.

x_rtolfloat, optional

Relative minimale Schrittweite. Wenn weggelassen, wird sie nicht verwendet.

tol_normfunction(vector) -> scalar, optional

Norm, die zur Überprüfung der Konvergenz verwendet wird. Standardmäßig wird die Maximalnorm verwendet.

line_search{None, ‘armijo’ (Standard), ‘wolfe’}, optional

Welche Art von Liniensuche zur Bestimmung der Schrittweite in der durch die Jacobi-Approximation gegebenen Richtung verwendet werden soll. Standardmäßig wird ‘armijo’ verwendet.

callbackfunction, optional

Optionale Callback-Funktion. Sie wird bei jeder Iteration als callback(x, f) aufgerufen, wobei x die aktuelle Lösung und f der entsprechende Rest ist.

Rückgabe:
solndarray

Ein Array (vom ähnlichen Array-Typ wie x0) mit der endgültigen Lösung.

Löst aus:
NoConvergence

Wenn keine Lösung gefunden wurde.

Siehe auch

root

Schnittstelle zu Root-Finding-Algorithmen für multivariate Funktionen. Beachten Sie insbesondere method='krylov'.

scipy.sparse.linalg.gmres
scipy.sparse.linalg.lgmres

Hinweise

Diese Funktion implementiert einen Newton-Krylov-Löser. Die Grundidee besteht darin, die Inverse der Jacobi-Matrix mit einer iterativen Krylov-Methode zu berechnen. Diese Methoden erfordern nur die Auswertung der Jacobi-Vektorprodukte, die bequem durch eine endliche Differenz angenähert werden.

\[J v \approx (f(x + \omega*v/|v|) - f(x)) / \omega\]

Aufgrund der Verwendung iterativer Matrixinversen können diese Methoden mit großen nichtlinearen Problemen umgehen.

Das Modul scipy.sparse.linalg von SciPy bietet eine Auswahl an Krylov-Lösern. Der Standard hier ist lgmres, eine Variante der wiederholten GMRES-Iteration, die einige der in den vorherigen Newton-Schritten gewonnenen Informationen wiederverwendet, um Jacobi-Matrizen in nachfolgenden Schritten zu invertieren.

Eine Übersicht über Newton-Krylov-Methoden finden Sie beispielsweise in [1] und für die LGMRES-sparse-inverse-Methode in [2].

Referenzen

[1]

C. T. Kelley, Solving Nonlinear Equations with Newton’s Method, SIAM, S. 57–83, 2003. DOI:10.1137/1.9780898718898.ch3

[2]

D.A. Knoll und D.E. Keyes, J. Comp. Phys. 193, 357 (2004). DOI:10.1016/j.jcp.2003.08.010

[3]

A.H. Baker und E.R. Jessup und T. Manteuffel, SIAM J. Matrix Anal. Appl. 26, 962 (2005). DOI:10.1137/S0895479803422014

Beispiele

Die folgenden Funktionen definieren ein System von nichtlinearen Gleichungen

>>> def fun(x):
...     return [x[0] + 0.5 * x[1] - 1.0,
...             0.5 * (x[1] - x[0]) ** 2]

Eine Lösung kann wie folgt erzielt werden.

>>> from scipy import optimize
>>> sol = optimize.newton_krylov(fun, [0, 0])
>>> sol
array([0.66731771, 0.66536458])