scipy.sparse.linalg.

cgs#

scipy.sparse.linalg.cgs(A, b, x0=None, *, rtol=1e-05, atol=0.0, maxiter=None, M=None, callback=None)[источник]#

Решить Ax = b с использованием метода сопряжённых градиентов в квадрате.

Параметры:
A{sparse array, ndarray, LinearOperator}

Вещественная матрица N-на-N линейной системы. В качестве альтернативы, A может быть линейным оператором, который может производить Ax используя, например, scipy.sparse.linalg.LinearOperator.

bndarray

Правая часть линейной системы. Имеет форму (N,) или (N,1).

x0ndarray

Начальное предположение для решения.

rtol, atolfloat, опционально

Параметры для теста сходимости. Для сходимости, norm(b - A @ x) <= max(rtol*norm(b), atol) должно быть удовлетворено. По умолчанию atol=0. и rtol=1e-5.

maxiterцелое число

Максимальное количество итераций. Итерация остановится после maxiter шагов, даже если указанная точность не достигнута.

M{sparse array, ndarray, LinearOperator}

Предобусловливатель для A. Она должна аппроксимировать обратную величину A (см. Примечания). Эффективное предобуславливание значительно улучшает скорость сходимости, что означает, что требуется меньше итераций для достижения заданной погрешности.

callbackфункция

Пользовательская функция, вызываемая после каждой итерации. Вызывается как callback(xk), где xk является текущим вектором решения.

Возвращает:
xndarray

Сходящееся решение.

infoцелое число
Предоставляет информацию о сходимости:

0 : успешный выход >0 : сходимость к допуску не достигнута, количество итераций <0 : сбой параметра

Примечания

Предобусловливатель M должна быть матрицей такой, что M @ A имеет меньшее число обусловленности, чем A, см. [1].

Ссылки

[1]

“Preconditioner”, Википедия, https://en.wikipedia.org/wiki/Preconditioner

[2]

“Метод сопряжённых градиентов в квадрате”, Википедия, https://en.wikipedia.org/wiki/Conjugate_gradient_squared_method

Примеры

>>> 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