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