scipy.sparse.linalg.

cg#

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

Решить Ax = b с методом сопряжённых градиентов, для симметричной, положительно-определённой A.

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

Вещественная или комплексная N-на-N матрица линейной системы. A должна представлять эрмитову, положительно определённую матрицу. Альтернативно, 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. M должна представлять эрмитову, положительно определённую матрицу. Она должна аппроксимировать обратную матрицу A (см. Примечания). Эффективное предобуславливание значительно улучшает скорость сходимости, что означает, что требуется меньше итераций для достижения заданной погрешности.

callbackфункция

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

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

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

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

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

Примечания

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

Ссылки

[1]

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

[2]

“Предобуславливатель”, Википедия, https://en.wikipedia.org/wiki/Preconditioner

Примеры

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