lgmres#
- scipy.sparse.linalg.lgmres(A, b, x0=None, *, rtol=1e-05, atol=0.0, maxiter=1000, M=None, callback=None, inner_m=30, outer_k=3, outer_v=None, store_outer_Av=True, prepend_outer_v=False)[Quelle]#
Löse
Ax = bmit dem LGMRES-Algorithmus.Der LGMRES-Algorithmus [1] [2] ist darauf ausgelegt, einige Probleme bei der Konvergenz von neu gestartetem GMRES zu vermeiden und konvergiert oft in weniger Iterationen.
- Parameter:
- A{sparse array, ndarray, LinearOperator}
Die reelle oder komplexe N-mal-N-Matrix des linearen Systems. Alternativ kann
Aein linearer Operator sein, derAxmit z.B.scipy.sparse.linalg.LinearOperatorerzeugen kann.- bndarray
Rechte Seite des linearen Systems. Hat die Form (N,) oder (N,1).
- x0ndarray
Startschätzung für die Lösung.
- rtol, atolfloat, optional
Parameter für den Konvergenztest. Für Konvergenz sollte
norm(b - A @ x) <= max(rtol*norm(b), atol)erfüllt sein. Der Standardwert istrtol=1e-5, der Standardwert füratolist0.0.- maxiterint, optional
Maximale Anzahl von Iterationen. Die Iteration wird nach maxiter-Schritten beendet, auch wenn die angegebene Toleranz nicht erreicht wurde.
- M{sparse array, ndarray, LinearOperator}, optional
Vorbedinger für A. Der Vorbedinger sollte die Inverse von A annähern. Effektive Vorbedingung verbessert die Konvergenzrate drastisch, was bedeutet, dass weniger Iterationen benötigt werden, um eine gegebene Fehlertoleranz zu erreichen.
- callbackfunction, optional
Vom Benutzer bereitgestellte Funktion, die nach jeder Iteration aufgerufen wird. Sie wird als callback(xk) aufgerufen, wobei xk der aktuelle Lösungsvektor ist.
- inner_mint, optional
Anzahl der inneren GMRES-Iterationen pro äußerer Iteration.
- outer_kint, optional
Anzahl der Vektoren, die zwischen den inneren GMRES-Iterationen beibehalten werden. Laut [1] sind gute Werte im Bereich von 1…3. Beachten Sie jedoch, dass größere Werte vorteilhaft sein können, wenn Sie die zusätzlichen Vektoren zur Beschleunigung der Lösung mehrerer ähnlicher Probleme verwenden möchten.
- outer_vlist von Tupeln, optional
Liste, die Tupel
(v, Av)von Vektoren und entsprechenden Matrix-Vektor-Produkten enthält, die zur Erweiterung des Krylov-Unterraums verwendet und zwischen den inneren GMRES-Iterationen beibehalten werden. Das ElementAvkann None sein, wenn das Matrix-Vektor-Produkt neu ausgewertet werden soll. Dieser Parameter wird vonlgmresin-place modifiziert und kann verwendet werden, um „Schätzvektoren“ beim Lösen ähnlicher Probleme in und aus dem Algorithmus zu übergeben.- store_outer_Avbool, optional
Ob LGMRES auch A@v zusätzlich zu den Vektoren v in der Liste outer_v speichern soll. Standard ist True.
- prepend_outer_vbool, optional
Ob die äußeren Augmentierungsvektoren von outer_v vor den Krylov-Iterierten platziert werden sollen. Im Standard-LGMRES ist prepend_outer_v=False.
- Rückgabe:
- xndarray
Die konvergierte Lösung.
- infoint
Liefert Konvergenzinformationen
0 : erfolgreicher Abschluss
>0 : Konvergenz zur Toleranz nicht erreicht, Anzahl der Iterationen
<0 : ungültige Eingabe oder Zusammenbruch
Hinweise
Der LGMRES-Algorithmus [1] [2] ist darauf ausgelegt, die Verlangsamung der Konvergenz im neu gestarteten GMRES aufgrund von alternierenden Restvektoren zu vermeiden. Typischerweise übertrifft er GMRES(m) mit vergleichbarem Speicherbedarf in irgendeiner Hinsicht, oder ist zumindest nicht viel schlechter.
Ein weiterer Vorteil dieses Algorithmus ist, dass Sie ihm „Schätzvektoren“ im Argument outer_v übergeben können, die den Krylov-Unterraum erweitern. Liegt die Lösung nahe am Spann dieser Vektoren, konvergiert der Algorithmus schneller. Dies kann nützlich sein, wenn mehrere sehr ähnliche Matrizen nacheinander invertiert werden müssen, wie z. B. bei Newton-Krylov-Iterationen, bei denen sich die Jacobi-Matrix in den nichtlinearen Schritten oft wenig ändert.
Referenzen
Beispiele
>>> import numpy as np >>> from scipy.sparse import csc_array >>> from scipy.sparse.linalg import lgmres >>> A = csc_array([[3, 2, 0], [1, -1, 0], [0, 5, 1]], dtype=float) >>> b = np.array([2, 4, -1], dtype=float) >>> x, exitCode = lgmres(A, b, atol=1e-5) >>> print(exitCode) # 0 indicates successful convergence 0 >>> np.allclose(A.dot(x), b) True