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