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 аргумент, расширяющий подпространство Крылова. Если решение лежит близко к охвату этих векторов, алгоритм сходится быстрее. Это может быть полезно, если несколько очень похожих матриц нужно инвертировать одна за другой, как в итерации Ньютона-Крылова, где матрица Якоби часто мало меняется на нелинейных шагах.
Ссылки
Примеры
>>> 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