scipy.sparse.linalg.

cg#

scipy.sparse.linalg.cg(A, b, x0=None, *, rtol=1e-05, atol=0.0, maxiter=None, M=None, callback=None)[Quelle]#

Lösen Sie Ax = b mit der Methode der konjugierten Gradienten für eine symmetrische, positiv-definitive A.

Parameter:
A{sparse array, ndarray, LinearOperator}

Die reelle oder komplexe N-mal-N-Matrix des linearen Systems. A muss eine hermitesche, positiv-definitive Matrix darstellen. Alternativ kann A ein linearer Operator sein, der Ax mithilfe von z. B. scipy.sparse.linalg.LinearOperator erzeugen 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 ist atol=0. und rtol=1e-5.

maxiterinteger

Maximale Anzahl von Iterationen. Die Iteration wird nach maxiter-Schritten beendet, auch wenn die angegebene Toleranz nicht erreicht wurde.

M{sparse array, ndarray, LinearOperator}

Präkonditionierer für A. M muss eine hermitesche, positiv-definitive Matrix darstellen. Sie sollte die Inverse von A approximieren (siehe Hinweise). Effektive Präkonditionierung verbessert dramatisch die Konvergenzrate, was bedeutet, dass weniger Iterationen benötigt werden, um eine gegebene Fehlertoleranz zu erreichen.

callbackfunction

Vom Benutzer bereitgestellte Funktion, die nach jeder Iteration aufgerufen wird. Sie wird als callback(xk) aufgerufen, wobei xk der aktuelle Lösungsvektor ist.

Rückgabe:
xndarray

Die konvergierte Lösung.

infointeger
Liefert Konvergenzinformationen

0 : erfolgreicher Abbruch >0 : Konvergenz zur Toleranz nicht erreicht, Anzahl der Iterationen

Hinweise

Der Präkonditionierer M sollte eine Matrix sein, so dass M @ A eine kleinere Konditionszahl als A hat, siehe [2].

Referenzen

[1]

„Methode der konjugierten Gradienten, Wikipedia, https://en.wikipedia.org/wiki/Conjugate_gradient_method

[2]

„Vorkonditionierer“, Wikipedia, https://de.wikipedia.org/wiki/Vorkonditionierer

Beispiele

>>> import numpy as np
>>> from scipy.sparse import csc_array
>>> from scipy.sparse.linalg import cg
>>> P = np.array([[4, 0, 1, 0],
...               [0, 5, 0, 0],
...               [1, 0, 3, 2],
...               [0, 0, 2, 4]])
>>> A = csc_array(P)
>>> b = np.array([-1, -0.5, -1, 2])
>>> x, exit_code = cg(A, b, atol=1e-5)
>>> print(exit_code)    # 0 indicates successful convergence
0
>>> np.allclose(A.dot(x), b)
True