В математике обобщенный метод минимальных остатков (GMRES) — итерационный метод численного решения неопределенной несимметричной системы линейных уравнений . Метод аппроксимирует решение вектором в подпространстве Крылова с минимальным остатком . Для нахождения этого вектора используется итерация Арнольди .
Метод GMRES был разработан Юсефом Саадом и Мартином Х. Шульцем в 1986 году. [1] Он является обобщением и улучшением метода MINRES , предложенного Пейджем и Сондерсом в 1975 году. [2] [3] Метод MINRES требует, чтобы матрица была симметричной, но имеет то преимущество, что он требует обработки только трех векторов. GMRES является частным случаем метода DIIS , разработанного Питером Пулэем в 1980 году. DIIS применим к нелинейным системам.
Обозначим евклидову норму любого вектора v через . Обозначим (квадратную) систему линейных уравнений, которую нужно решить, через Матрица A предполагается обратимой размером m на m . Кроме того, предполагается, что b нормализовано , т.е.
n -ое подпространство Крылова для этой задачи равно , где — начальная ошибка при заданном начальном предположении . Очевидно, что если .
GMRES аппроксимирует точное решение вектором , который минимизирует евклидову норму невязки .
Векторы могут быть близки к линейно зависимым , поэтому вместо этого базиса используется итерация Арнольди для нахождения ортонормальных векторов , которые образуют базис для . В частности, .
Следовательно, вектор можно записать как с , где — матрица размером m на n, образованная . Другими словами, нахождение n -го приближения решения (т.е. ) сводится к нахождению вектора , который определяется посредством минимизации остатка, как описано ниже.
Процесс Арнольди также создает , матрицу Хессенберга ( ) , которая удовлетворяет равенству, которое используется для упрощения вычисления (см. § Решение задачи наименьших квадратов). Обратите внимание, что для симметричных матриц фактически достигается симметричная трехдиагональная матрица, что приводит к методу MINRES .
Поскольку столбцы ортонормальны, то имеем , где — первый вектор в стандартном базисе , а — первый пробный вектор остатка (обычно ). Следовательно, можно найти, минимизируя евклидову норму остатка Это линейная задача наименьших квадратов размера n .
Это дает метод GMRES. На -й итерации:
На каждой итерации должно быть вычислено произведение матрицы на вектор. Это стоит около операций с плавающей точкой для общих плотных матриц размера , но стоимость может уменьшиться до для разреженных матриц . В дополнение к произведению матрицы на вектор, операции с плавающей точкой должны быть вычислены на n -й итерации.
Итерация n минимизирует остаток в подпространстве Крылова . Поскольку каждое подпространство содержится в следующем подпространстве, остаток не увеличивается. После m итераций, где m — размер матрицы A , пространство Крылова K m равно всему R m и, следовательно, метод GMRES приходит к точному решению. Однако идея заключается в том, что после небольшого числа итераций (относительно m ) вектор x n уже является хорошим приближением к точному решению.
В общем случае этого не происходит. Действительно, теорема Гринбаума, Птака и Стракоша утверждает, что для каждой невозрастающей последовательности a 1 , ..., a m −1 , a m = 0, можно найти матрицу A такую, что ‖ r n ‖ = a n для всех n , где r n — остаток, определенный выше. В частности, можно найти матрицу, для которой остаток остается постоянным в течение m − 1 итераций и падает до нуля только на последней итерации.
На практике, однако, GMRES часто работает хорошо. Это можно доказать в конкретных ситуациях. Если симметричная часть A , то есть , положительно определена , то где и обозначают наименьшее и наибольшее собственное значение матрицы , соответственно. [4]
Если A симметричен и положительно определен, то мы даже имеем , где обозначает число обусловленности A в евклидовой норме.
В общем случае, когда A не является положительно определенным, мы имеем где P n обозначает множество полиномов степени не выше n с p (0) = 1, V — матрица, появляющаяся в спектральном разложении A , а σ ( A ) — спектр A. Грубо говоря, это говорит о том, что быстрая сходимость происходит, когда собственные значения A сгруппированы вдали от начала координат и A не слишком далеко от нормальности . [5]
Все эти неравенства ограничивают только остатки, а не фактическую ошибку, то есть расстояние между текущей итерацией x n и точным решением.
Как и другие итерационные методы, GMRES обычно сочетается с методом предварительной подготовки для ускорения сходимости.
Стоимость итераций растет как O( n 2 ), где n — номер итерации. Поэтому метод иногда перезапускается после некоторого количества, скажем , k итераций, с x k в качестве начального предположения. Результирующий метод называется GMRES( k ) или перезапущенный GMRES. Для неположительно определенных матриц этот метод может страдать от застоя в сходимости, поскольку перезапущенное подпространство часто близко к более раннему подпространству.
Недостатки GMRES и перезапущенного GMRES устраняются путем повторного использования подпространства Крылова в методах типа GCRO, таких как GCROT и GCRODR. [6] Повторное использование подпространств Крылова в GMRES также может ускорить сходимость, когда необходимо решить последовательности линейных систем. [7]
Итерация Арнольди сводится к итерации Ланцоша для симметричных матриц. Соответствующий метод подпространства Крылова — это метод минимальных остатков (MinRes) Пейджа и Сондерса. В отличие от несимметричного случая, метод MinRes задается трехчленным рекуррентным соотношением . Можно показать, что не существует метода подпространства Крылова для общих матриц, который задается коротким рекуррентным соотношением и при этом минимизирует нормы остатков, как это делает GMRES.
Другой класс методов строится на несимметричной итерации Ланцоша, в частности метод BiCG . Они используют трехчленное рекуррентное соотношение, но они не достигают минимального остатка, и, следовательно, остаток не уменьшается монотонно для этих методов. Сходимость даже не гарантируется.
Третий класс образуют такие методы, как CGS и BiCGSTAB . Они также работают с трехчленным рекуррентным соотношением (следовательно, без оптимальности) и могут даже преждевременно завершиться без достижения сходимости. Идея этих методов заключается в том, чтобы выбрать подходящим образом порождающие полиномы итерационной последовательности.
Ни один из этих трех классов не является лучшим для всех матриц; всегда есть примеры, в которых один класс превосходит другой. Поэтому на практике испытываются несколько решателей, чтобы увидеть, какой из них лучше всего подходит для данной проблемы.
Одна из частей метода GMRES заключается в поиске вектора, который минимизирует Обратите внимание, что это матрица размером ( n + 1) на n , поэтому она дает сверхограниченную линейную систему из n + 1 уравнений для n неизвестных.
Минимум можно вычислить с помощью QR-разложения : найти ортогональную матрицу Ω n размером ( n + 1) на ( n + 1) и верхнюю треугольную матрицу ( n + 1) на n, такую, что Треугольная матрица имеет на одну строку больше, чем столбцов, поэтому ее нижняя строка состоит из нуля. Следовательно, ее можно разложить следующим образом, где — треугольная матрица размером n на n (то есть квадратная).
QR-разложение можно легко обновить от одной итерации к другой, поскольку матрицы Хессенберга отличаются только строкой нулей и столбцом: где h n+1 = ( h 1, n +1 , ..., h n +1, n +1 ) T . Это означает, что предварительное умножение матрицы Хессенберга на Ω n , дополненное нулями и строкой с мультипликативным тождеством, дает почти треугольную матрицу: Она была бы треугольной, если бы σ было равно нулю. Чтобы исправить это, нужно вращение Гивенса , где С этим вращением Гивенса мы формируем Действительно, является треугольной матрицей с .
Учитывая QR-разложение, задача минимизации легко решается, если заметить, что Обозначим вектор через с g n ∈ R n и γ n ∈ R , тогда Вектор y , который минимизирует это выражение, задается как Опять же, векторы легко обновлять. [8]
функция [x, e] = gmres ( A, b, x, max_iterations, threshold ) n = длина ( A ); m = max_iterations ; % использовать x как начальный вектор r = b - A * x ; b_норма = норма ( b ); ошибка = норма ( r ) / b_норма ; % инициализируем одномерные векторы sn = нули ( m , 1 ); cs = нули ( m , 1 ); %e1 = нули(n, 1); e1 = нули ( m + 1 , 1 ); e1 ( 1 ) = 1 ; e = [ ошибка ]; r_norm = норма ( r ); Q (:, 1 ) = r / r_norm ; % Примечание: это не бета-скаляр в разделе "Метод" выше, а % бета-скаляр, умноженный на e1 beta = r_norm * e1 ; для k = 1 : m % запустить arnoldi [ H ( 1 : k + 1 , k ), Q (:, k + 1 )] = arnoldi ( A , Q , k ); % исключить последний элемент в H -й строке и обновить матрицу вращения [ H ( 1 : k + 1 , k ), cs ( k ), sn ( k )] = apply_givens_rotation ( H ( 1 : k + 1 , k ), cs , sn , k ); % обновить вектор остатков beta ( k + 1 ) = - sn ( k ) * beta ( k ); beta ( k ) = cs ( k ) * beta ( k ); error = abs ( beta ( k + 1 )) / b_norm ; % сохранить ошибку e = [ e ; error ]; если ( ошибка <= порог ) break ; конец конец % если порог не достигнут, k = m в этой точке (а не m+1) % вычислить результат y = H ( 1 : k , 1 : k ) \ beta ( 1 : k ); x = x + Q (:, 1 : k ) * y ; конец %----------------------------------------------------% % Функция Арнольди % %----------------------------------------------------% function [h, q] = arnoldi ( A, Q, k ) q = A * Q (:, k ); % Вектор Крылова для i = 1 : k % Модифицированный Грам-Шмидт, сохраняющий матрицу Хессенберга h ( i ) = q ' * Q (:, i ); q = q - h ( i ) * Q (:, i ); end h ( k + 1 ) = norm ( q ); q = q / h ( k + 1 ); end %---------------------------------------------------------------------% % Применение вращения Гивенса к столбцу H % %---------------------------------------------------------------------% function [h, cs_k, sn_k] = apply_givens_rotation ( h, cs, sn, k ) % применить для i-го столбца для i = 1 : k - 1 temp = cs ( i ) * h ( i ) + sn ( i ) * h ( i + 1 ); h ( i + 1 ) = - sn ( i ) * h ( i ) + cs ( i ) * h ( i + 1 ); h ( i ) = temp ; конец % обновить следующие значения sin cos для вращения [ cs_k , sn_k ] = givens_rotation ( h ( k ), h ( k + 1 )); % исключить H(i + 1, i) h ( k ) = cs_k * h ( k ) + sn_k * h ( k + 1 ); h ( k + 1 ) = 0.0 ; конец %%----Вычислить матрицу вращения Гивенса----%% function [cs, sn] = givens_rotation ( v1, v2 ) % if (v1 == 0) % cs = 0; % sn = 1; % else t = sqrt ( v1 ^ 2 + v2 ^ 2 ); % cs = abs(v1) / t; % sn = cs * v2 / v1; cs = v1 / t ; % см. http://www.netlib.org/eispack/comqr.f sn = v2 / t ; % end end
{{cite book}}
: CS1 maint: multiple names: authors list (link)