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.linalgimplementiert. 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, wobeixden aktuellen Punkt undfden 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.gmresfü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
NoConvergenceausgelö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
rootSchnittstelle zu Root-Finding-Algorithmen für multivariate Funktionen. Beachten Sie insbesondere
method='krylov'.scipy.sparse.linalg.gmresscipy.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.linalgvon 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])