scipy.sparse.linalg.

cgs#

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

Solve Ax = b with the Conjugate Gradient Squared method.

Parameters:
A{sparse array, ndarray, LinearOperator}

The real-valued N-by-N matrix of the linear system. Alternatively, A can be a linear operator which can produce Ax using, e.g., scipy.sparse.linalg.LinearOperator.

bndarray

Right hand side of the linear system. Has shape (N,) or (N,1).

x0ndarray

Starting guess for the solution.

rtol, atolfloat, optional

Parameters for the convergence test. For convergence, norm(b - A @ x) <= max(rtol*norm(b), atol) should be satisfied. The default is atol=0. and rtol=1e-5.

maxiterint

Maximum number of iterations. Iteration will stop after maxiter steps even if the specified tolerance has not been achieved.

M{sparse array, ndarray, LinearOperator}

Preconditioner for A. It should approximate the inverse of A (see Notes). Effective preconditioning dramatically improves the rate of convergence, which implies that fewer iterations are needed to reach a given error tolerance.

callbackfunction

User-supplied function to call after each iteration. It is called as callback(xk), where xk is the current solution vector.

Returns:
xndarray

The converged solution.

infoint
Provides convergence information:

0 : successful exit >0 : convergence to tolerance not achieved, number of iterations <0 : parameter breakdown

Notes

The preconditioner M should be a matrix such that M @ A has a smaller condition number than A, see [1].

Array API Standard Support

cgs has experimental support for Python Array API Standard compatible backends in addition to NumPy. Please consider testing these features by setting an environment variable SCIPY_ARRAY_API=1 and providing CuPy, PyTorch, JAX, or Dask arrays as array arguments. The following combinations of backend and device (or other capability) are supported.

Library

CPU

GPU

NumPy

n/a

CuPy

n/a

PyTorch

JAX

Dask

n/a

See Support for the array API standard for more information.

References

[1]

“Preconditioner”, Wikipedia, https://en.wikipedia.org/wiki/Preconditioner

[2]

“Conjugate gradient squared”, Wikipedia, https://en.wikipedia.org/wiki/Conjugate_gradient_squared_method

Examples

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