scipy.sparse.linalg.

lgmres#

scipy.sparse.linalg.lgmres(A, b, x0=None, *, rtol=1e-05, atol=0.0, maxiter=1000, M=None, callback=None, inner_m=30, outer_k=3, outer_v=None, store_outer_Av=True, prepend_outer_v=False)[источник]#

Решить Ax = b с алгоритмом LGMRES.

Алгоритм LGMRES [1] [2] разработан для избежания некоторых проблем в сходимости перезапущенного GMRES и часто сходится за меньшее количество итераций.

Параметры:
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) должно быть удовлетворено. По умолчанию rtol=1e-5, по умолчанию для atol является 0.0.

maxiterint, необязательный

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

M{разреженный массив, ndarray, LinearOperator}, опционально

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

callbackфункция, необязательный

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

inner_mint, необязательный

Количество внутренних итераций GMRES на каждую внешнюю итерацию.

outer_kint, необязательный

Количество векторов для переноса между внутренними итерациями GMRES. Согласно [1], хорошие значения находятся в диапазоне 1…3. Однако обратите внимание, что если вы хотите использовать дополнительные векторы для ускорения решения нескольких похожих задач, могут быть полезны большие значения.

outer_vсписок кортежей, опционально

Список, содержащий кортежи (v, Av) векторов и соответствующих матрично-векторных произведений, используемых для расширения подпространства Крылова и переносимых между внутренними итерациями GMRES. Элемент Av может быть None если произведение матрицы на вектор должно быть пересчитано. Этот параметр изменяется на месте с помощью lgmresи может использоваться для передачи «предполагаемых» векторов в алгоритм и из него при решении похожих задач.

store_outer_Avbool, необязательно

Должен ли LGMRES хранить также A@v в дополнение к векторам v в outer_v list. По умолчанию True.

prepend_outer_vbool, необязательно

Размещать ли векторы дополнения outer_v перед итерациями Крылова. В стандартном LGMRES, prepend_outer_v=False.

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

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

infoint

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

  • 0 : успешный выход

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

  • <0 : недопустимый ввод или сбой

Примечания

Алгоритм LGMRES [1] [2] разработан для избежания замедления сходимости в перезапускаемом GMRES из-за чередующихся векторов невязки. Обычно он часто превосходит GMRES(m) с сопоставимыми требованиями к памяти по некоторым показателям или, по крайней мере, не намного хуже.

Ещё одно преимущество этого алгоритма в том, что вы можете предоставить ему 'угаданные' векторы в outer_v аргумент, расширяющий подпространство Крылова. Если решение лежит близко к охвату этих векторов, алгоритм сходится быстрее. Это может быть полезно, если несколько очень похожих матриц нужно инвертировать одна за другой, как в итерации Ньютона-Крылова, где матрица Якоби часто мало меняется на нелинейных шагах.

Ссылки

[1] (1,2,3)

A.H. Baker и E.R. Jessup и T. Manteuffel, "Техника для ускорения сходимости перезапущенного GMRES", SIAM J. Matrix Anal. Appl. 26, 962 (2005).

[2] (1,2)

A.H. Baker, "On Improving the Performance of the Linear Solver restarted GMRES", докторская диссертация, Университет Колорадо (2003).

Примеры

>>> import numpy as np
>>> from scipy.sparse import csc_array
>>> from scipy.sparse.linalg import lgmres
>>> A = csc_array([[3, 2, 0], [1, -1, 0], [0, 5, 1]], dtype=float)
>>> b = np.array([2, 4, -1], dtype=float)
>>> x, exitCode = lgmres(A, b, atol=1e-5)
>>> print(exitCode)            # 0 indicates successful convergence
0
>>> np.allclose(A.dot(x), b)
True