<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alexander34396</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Alexander34396"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Alexander34396"/>
	<updated>2026-10-22T23:23:34Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=20014</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=20014"/>
		<updated>2016-12-04T12:20:19Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов, &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, &lt;br /&gt;
где &lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
- верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Невязка исходной системы имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = b - A(x_0 + z_m) = r_0 - AV_my_m = \beta v_1 - V_{m+1}H_{m+1m}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = \beta V_{m+1}e_1 - H_{m+1m}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; e_1 = (1,0,0,\ldots,0)^T &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма невязки &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_m\|_2 = \|\beta e_1 - H_{m+1m}y_m\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt; достигает минимума при &amp;lt;math&amp;gt; \beta e_1 = H_{m+1m}y_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения решения такой системы, матрица &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|вращений Гивенса]].&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Масштабируемость рассматривалась в работах &amp;lt;ref&amp;gt;https://arxiv.org/pdf/1606.08740.pdf&amp;lt;/ref&amp;gt; и &amp;lt;ref&amp;gt;https://smartech.gatech.edu/bitstream/handle/1853/55635/PRATAPA-DISSERTATION-2016.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Для исследования масштабируемости была использована параллельная реализация с использованием объекта KSP(решатель СЛАУ) бибилиотеки PETSc(содержащей структуры, типы данных и подпрограммы для параллельной реализации методов на подпространствах Крылова), найденная на GitHub &amp;lt;ref&amp;gt;https://github.com/erdc-cm/petsc-dev/tree/master/src/ksp/ksp/impls/gmres&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычисления проводились на вычислительном кластере, состоящем из 16 узлов, со следующей конфигурацией:&lt;br /&gt;
Altus 1804i Server - 4P Interlagos Node, Quad AMD Opteron 6276, 16C,&lt;br /&gt;
2.3 GHz, 128GB, DDR3-1333 ECC, 80GB SSD, MLC, 2.5&amp;quot; HCA, Mellanox ConnectX 2, 1-port QSFP, QDR, memfree, CentOS, Version 5.&lt;br /&gt;
&lt;br /&gt;
На рис. 2 представлен график сильной масштабируемости.&lt;br /&gt;
&lt;br /&gt;
[[File:scaling.JPG|thumb|center|500px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Зависимость производительности от числа процессоров (запуск производился на 1, 8, 27, 64, 216, 512, 1000 процессорах)]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=19703</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=19703"/>
		<updated>2016-11-30T18:20:17Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов, &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, &lt;br /&gt;
где &lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
- верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Невязка исходной системы имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = b - A(x_0 + z_m) = r_0 - AV_my_m = \beta v_1 - V_{m+1}H_{m+1m}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = \beta V_{m+1}e_1 - H_{m+1m}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; e_1 = (1,0,0,\ldots,0)^T &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма невязки &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_m\|_2 = \|\beta e_1 - H_{m+1m}y_m\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt; достигает минимума при &amp;lt;math&amp;gt; \beta e_1 = H_{m+1m}y_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения решения такой системы, матрица &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|вращений Гивенса]].&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Масштабируемость рассматривалась в работах &amp;lt;ref&amp;gt;https://arxiv.org/pdf/1606.08740.pdf&amp;lt;/ref&amp;gt; и &amp;lt;ref&amp;gt;https://smartech.gatech.edu/bitstream/handle/1853/55635/PRATAPA-DISSERTATION-2016.pdf&amp;lt;/ref&amp;gt;.&lt;br /&gt;
Для исследования масштабируемости была использована параллельная реализация с использованием объекта KSP(решатель СЛАУ) бибилиотеки PETSc(содержащей структуры, типы данных и подпрограммы для параллельной реализации методов на подпространствах Крылова), найденная на GitHub &amp;lt;ref&amp;gt;https://github.com/erdc-cm/petsc-dev/tree/master/src/ksp/ksp/impls/gmres&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вычисления проводились на вычислительном кластере, состоящем из 16 узлов, со следующей конфигурацией:&lt;br /&gt;
Altus 1804i Server - 4P Interlagos Node, Quad AMD Opteron 6276, 16C,&lt;br /&gt;
2.3 GHz, 128GB, DDR3-1333 ECC, 80GB SSD, MLC, 2.5&amp;quot; HCA, Mellanox ConnectX 2, 1-port QSFP, QDR, memfree, CentOS, Version 5.&lt;br /&gt;
&lt;br /&gt;
На рис. 2 представлен график сильной масштабируемости.&lt;br /&gt;
&lt;br /&gt;
[[File:scaling.JPG|thumb|center|500px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Зависимость производительности от числа процессоров (запуск производился на 1, 8, 27, 64, 216, 512, 1000 процессорах)]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=17955</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=17955"/>
		<updated>2016-11-17T17:03:12Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Минимизация функционала невязки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов, &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, &lt;br /&gt;
где &lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
- верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Невязка исходной системы имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = b - A(x_0 + z_m) = r_0 - AV_my_m = \beta v_1 - V_{m+1}H_{m+1m}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = \beta V_{m+1}e_1 - H_{m+1m}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; e_1 = (1,0,0,\ldots,0)^T &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма невязки &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_m\|_2 = \|\beta e_1 - H_{m+1m}y_m\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt; достигает минимума при &amp;lt;math&amp;gt; \beta e_1 = H_{m+1m}y_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения решения такой системы, матрица &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|вращений Гивенса]].&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Alexander34396&amp;diff=16972</id>
		<title>Обсуждение участника:Alexander34396</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Alexander34396&amp;diff=16972"/>
		<updated>2016-11-14T12:09:10Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Добрый день. Начал проверять статью и оставил следующие заметки&lt;br /&gt;
&lt;br /&gt;
Здравствуйте. Немного исправил статью, исходя из ваших замечаний.&lt;br /&gt;
&lt;br /&gt;
= 1.2 = &lt;br /&gt;
На мой взгляд, нужны определения&lt;br /&gt;
span?&lt;br /&gt;
l2-норма?&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]] Дано пояснение обозначения span.Вместо l2-норма теперь используется Евклидова норма.&lt;br /&gt;
&lt;br /&gt;
= 1.2.1 = &lt;br /&gt;
Вот я читаю этот раздел как человек со стороны и вижу много формул. Почему они именно такие? В чем суть этого алгоритма?&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]] Перед алгоритмом добавлено описание идеи алгоритма и пояснения к формулам.&lt;br /&gt;
&lt;br /&gt;
= 1.2.2 = &lt;br /&gt;
Новые определения&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]] Добавлены некоторые пояснения.Добавлена ссылка на статью - вращения Гивенса.&lt;br /&gt;
&lt;br /&gt;
Затем я остановился, и у меня главные вопрос. Возможно ли сделать статью такой, чтобы для ее прочтения не требовалось обращаться к куче дополнительных источников? Вот я человек со стороны, хотя и заканчивал мехмат. Я могу разобраться со всем написанным здесь, но для этого мне придется гуглить кучу материалов. Но, насколько я понимаю, цель таких статей - быть более полными.&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]]  На мой взгляд, формат статей algo-wiki не подразумевает подробных объяснений и выводов формул, поэтому я добавил только некоторые пояснения, которые делают повествование более последовательным и несколько более понятным. При этом для полного понимания описанного метода для человека со стороны всё равно придётся обращаться к сторонним источникам.&lt;br /&gt;
&lt;br /&gt;
Можете или добавить объяснений или возразить мне. В любом случае, пока с прочтением остановился, жду ответа или исправление (а лучше и того, и другого)&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Alexander34396&amp;diff=16210</id>
		<title>Обсуждение участника:Alexander34396</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Alexander34396&amp;diff=16210"/>
		<updated>2016-11-08T21:37:59Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Добрый день. Начал проверять статью и оставил следующие заметки&lt;br /&gt;
&lt;br /&gt;
Здравствуйте. Немного исправил статью, исходя из ваших замечаний.&lt;br /&gt;
&lt;br /&gt;
= 1.2 = &lt;br /&gt;
На мой взгляд, нужны определения&lt;br /&gt;
span?&lt;br /&gt;
l2-норма?&lt;br /&gt;
&lt;br /&gt;
Дано пояснение обозначения span.Вместо l2-норма теперь используется Евклидова норма.&lt;br /&gt;
&lt;br /&gt;
= 1.2.1 = &lt;br /&gt;
Вот я читаю этот раздел как человек со стороны и вижу много формул. Почему они именно такие? В чем суть этого алгоритма?&lt;br /&gt;
&lt;br /&gt;
Перед формальным алгоритмом добавлено описание идеи алгоритма и пояснения к формулам.&lt;br /&gt;
&lt;br /&gt;
= 1.2.2 = &lt;br /&gt;
Новые определения&lt;br /&gt;
&lt;br /&gt;
Добавлены некоторые пояснения.Добавлена ссылка на статью - вращения Гивенса.&lt;br /&gt;
&lt;br /&gt;
Затем я остановился, и у меня главные вопрос. Возможно ли сделать статью такой, чтобы для ее прочтения не требовалось обращаться к куче дополнительных источников? Вот я человек со стороны, хотя и заканчивал мехмат. Я могу разобраться со всем написанным здесь, но для этого мне придется гуглить кучу материалов. Но, насколько я понимаю, цель таких статей - быть более полными.&lt;br /&gt;
&lt;br /&gt;
На мой взгляд, формат статей algo-wiki не подразумевает подробных объяснений и выводов формул, поэтому я добавил только некоторые пояснения, которые делают повествование более последовательным и несколько более понятным. При этом для полного понимания описанного метода для человека со стороны всё равно придётся обращаться к сторонним источникам.&lt;br /&gt;
&lt;br /&gt;
Можете или добавить объяснений или возразить мне. В любом случае, пока с прочтением остановился, жду ответа или исправление (а лучше и того, и другого)&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16198</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16198"/>
		<updated>2016-11-08T18:58:21Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Минимизация функционала невязки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов, &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, &lt;br /&gt;
где &lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
- верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Невязка исходной системы имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = b - A(x_0 + z_m) = r_0 - AV_my_m = \beta v_1 - V_{m+1}H_{m+1k}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = \beta V_{m+1}e_1 - H_{m+1m}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; e_1 = (1,0,0,\ldots,0)^T &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма невязки &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_m\|_2 = \|\beta e_1 - H_{m+1m}y_m\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt; достигает минимума при &amp;lt;math&amp;gt; \beta e_1 = H_{m+1m}y_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения решения такой системы, матрица &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|вращений Гивенса]].&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16197</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16197"/>
		<updated>2016-11-08T18:57:09Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Минимизация функционала невязки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов, &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, &lt;br /&gt;
где &lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
- верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Невязка исходной системы имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = b - A(x_0 + z_m) = r_0 - AV_my_m = \beta v_1 - V_{m+1}H_{m+1k}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = \beta V_{m+1}e_1 - H_{m+1m}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; e_1 = (1,0,0,\ldots,0)^T &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма невязки &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_m\|_2 = \|\beta e_1 - H_{m+1m}y_m\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt; достигает минимума при &amp;lt;math&amp;gt; \beta e_1 = H_{m+1m}y_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения решения такой системы, матрица &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных [[algowiki-project.org/ru/Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|вращений Гивенса]].&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16196</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16196"/>
		<updated>2016-11-08T18:52:55Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Минимизация функционала невязки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов, &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, &lt;br /&gt;
где &lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
- верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Невязка исходной системы имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = b - A(x_0 + z_m) = r_0 - AV_my_m = \beta v_1 - V_{m+1}H_{m+1k}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = \beta V_{m+1}e_1 - H_{m+1m}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; e_1 = (1,0,0,\ldots,0)^T &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма невязки &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_m\|_2 = \|\beta e_1 - H_{m+1m}y_m\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt; достигает минимума при &amp;lt;math&amp;gt; \beta e_1 = H_{m+1m}y_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения решения такой системы, матрица &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных [[вращений Гивенса]].&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16195</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16195"/>
		<updated>2016-11-08T18:48:59Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Ортогонализация Арнольди */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов, &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, &lt;br /&gt;
где &lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
- верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Невязка исходной системы имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = b - A(x_0 + z_m) = r_0 - AV_my_m = \beta v_1 - V_{m+1}H_{m+1k}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = \beta V_{m+1}e_1 - H_{m+1m}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; e_1 = (1,0,0,\ldots,0)^T &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма невязки &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_m\|_2 = \|\beta e_1 - H_{m+1m}y_m\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt; достигает минимума при &amp;lt;math&amp;gt; \beta e_1 = H_{m+1m}y_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения решения такой системы, матрица &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16194</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16194"/>
		<updated>2016-11-08T18:48:32Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Ортогонализация Арнольди */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов, &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, &lt;br /&gt;
где &lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
 - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Невязка исходной системы имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = b - A(x_0 + z_m) = r_0 - AV_my_m = \beta v_1 - V_{m+1}H_{m+1k}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = \beta V_{m+1}e_1 - H_{m+1m}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; e_1 = (1,0,0,\ldots,0)^T &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма невязки &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_m\|_2 = \|\beta e_1 - H_{m+1m}y_m\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt; достигает минимума при &amp;lt;math&amp;gt; \beta e_1 = H_{m+1m}y_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения решения такой системы, матрица &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16193</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16193"/>
		<updated>2016-11-08T18:48:10Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Ортогонализация Арнольди */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов, &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, &lt;br /&gt;
где &lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
-верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Невязка исходной системы имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = b - A(x_0 + z_m) = r_0 - AV_my_m = \beta v_1 - V_{m+1}H_{m+1k}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = \beta V_{m+1}e_1 - H_{m+1m}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; e_1 = (1,0,0,\ldots,0)^T &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма невязки &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_m\|_2 = \|\beta e_1 - H_{m+1m}y_m\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt; достигает минимума при &amp;lt;math&amp;gt; \beta e_1 = H_{m+1m}y_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения решения такой системы, матрица &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16192</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16192"/>
		<updated>2016-11-08T18:46:03Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Минимизация функционала невязки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов, &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, &lt;br /&gt;
где &lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Невязка исходной системы имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = b - A(x_0 + z_m) = r_0 - AV_my_m = \beta v_1 - V_{m+1}H_{m+1k}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = \beta V_{m+1}e_1 - H_{m+1m}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; e_1 = (1,0,0,\ldots,0)^T &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма невязки &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_m\|_2 = \|\beta e_1 - H_{m+1m}y_m\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt; достигает минимума при &amp;lt;math&amp;gt; \beta e_1 = H_{m+1m}y_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения решения такой системы, матрица &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16191</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16191"/>
		<updated>2016-11-08T18:44:58Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Минимизация функционала невязки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов, &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, &lt;br /&gt;
где &lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Невязка исходной системы имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = b - A(x_0 + z_m) = r_0 - AV_my_m = \beta v_1 - V_{m+1}H_{m+1k}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = \beta V_{m+1}e_1 - H_{m+1m}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; e_1 = (1,0,0,\ldots,0)^T &amp;lt;/math&amp;gt;.&lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_m\|_2 = \|\beta e_1 - H_{m+1m}y_m\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt; достигает минимума при &amp;lt;math&amp;gt; \beta e_1 = H_{m+1m}y_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения решения такой системы, матрица &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16190</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16190"/>
		<updated>2016-11-08T18:44:26Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Минимизация функционала невязки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов, &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, &lt;br /&gt;
где &lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Невязка исходной системы имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = b - A(x_0 + z_m) = r_0 - AV_my_m = \beta v_1 - V_{m+1}H_{m+1k}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_m = \beta V_{m+1}e_1 - H_{m+1m}y_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; e_1 = (1,0,0,\ldots,0)^T &amp;lt;/math&amp;gt;,&lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_m\|_2 = \|\beta e_1 - H_{m+1m}y_m\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Норма &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt; достигает минимума при &amp;lt;math&amp;gt; \beta e_1 = H_{m+1m}y_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения решения такой системы, матрица &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16186</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16186"/>
		<updated>2016-11-08T18:16:20Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Минимизация функционала невязки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов, &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, &lt;br /&gt;
где &lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;-ой итерации алгоритма GMRES невязка имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_k = b - A(x_0 + z_k) = r_0 - AV_ky_k = \beta v_1 - V_{k+1}H_{k+1k}y_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_k = \beta V_{k+1}e_1 - H_{k+1k}y_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; e_1 = (1,0,0,\ldots,0)^T \, &amp;lt;/math&amp;gt;.&lt;br /&gt;
На каждой итерации алгоритма GMRES минимизируется Евклидова норма невязки: &lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_k\|_2 = \|\beta e_1 - H_{k+1k}y_k\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
Эта норма достигает минимума при &amp;lt;math&amp;gt; \beta e_1 = H_{k+1k}y_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16185</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16185"/>
		<updated>2016-11-08T18:05:05Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Ортогонализация Арнольди */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов, &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, &lt;br /&gt;
где &lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;-ой итерации алгоритма GMRES невязка имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_k = b - A(x_0 + z_k) = r_0 - AV_ky_k = \beta v_1 - V_{k+1}H_{k+1k}y_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_k = \beta V_{k+1}e_1 - H_{k+1k}y_k&amp;lt;/math&amp;gt;;&lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_k\|_2 = \beta e_1 - H_{k+1k}y_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16184</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16184"/>
		<updated>2016-11-08T17:48:19Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_m \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
* Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
* Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; вида:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;-ой итерации алгоритма GMRES невязка имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_k = b - A(x_0 + z_k) = r_0 - AV_ky_k = \beta v_1 - V_{k+1}H_{k+1k}y_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_k = \beta V_{k+1}e_1 - H_{k+1k}y_k&amp;lt;/math&amp;gt;;&lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_k\|_2 = \beta e_1 - H_{k+1k}y_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16183</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16183"/>
		<updated>2016-11-08T17:38:37Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Минимизация функционала невязки */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
* Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
* Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; вида:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;-ой итерации алгоритма GMRES невязка имеет вид:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_k = b - A(x_0 + z_k) = r_0 - AV_ky_k = \beta v_1 - V_{k+1}H_{k+1k}y_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
C учетом того, что матрица &amp;lt;math&amp;gt; V_{k+1} &amp;lt;/math&amp;gt; составлена из ортонормированных векторов:&lt;br /&gt;
: &amp;lt;math&amp;gt; r_k = \beta V_{k+1}e_1 - H_{k+1k}y_k&amp;lt;/math&amp;gt;;&lt;br /&gt;
: &amp;lt;math&amp;gt; \|r_k\|_2 = \beta e_1 - H_{k+1k}y_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16174</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16174"/>
		<updated>2016-11-08T16:40:54Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Ортогонализация Арнольди */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
* Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
* Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; вида:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16173</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16173"/>
		<updated>2016-11-08T16:38:28Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Ортогонализация Арнольди */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
* Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
* Матричное представление процесса Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; вида:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16172</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16172"/>
		<updated>2016-11-08T16:37:59Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Ортогонализация Арнольди */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
* Поправка решения:&lt;br /&gt;
: &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
* Матричное представление алгоритма Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; AV_m = V_{m+1}H_{m+1m} = V_mH_m + h_{m+1m}v_{m+1} e_m^T &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; H_{m+1m} &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; вида:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;H_{m+1m} = \begin{bmatrix}h_{11} &amp;amp; h_{12} &amp;amp; h_{13} &amp;amp;... &amp;amp; h_{1m-1} &amp;amp; h_{1m} \\ h_{21} &amp;amp; h_{22} &amp;amp; h_{23} &amp;amp; ... &amp;amp; h_{2m-1} &amp;amp; h_{2m} \\ 0 &amp;amp; h_{32} &amp;amp; h_{33} &amp;amp;...&amp;amp; h_{3m-1} &amp;amp; h_{3m} \\ ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... &amp;amp; ... \\ 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; h_{m m-1} &amp;amp; h_{mm} \\0 &amp;amp; 0 &amp;amp; 0 &amp;amp; ... &amp;amp; 0 &amp;amp; h_{m+1 m}\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16156</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16156"/>
		<updated>2016-11-08T16:06:50Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Ортогонализация Арнольди */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_m = V_mH_m + h_{m+1m}v_{m+1} e_m^T = V_{m+1}\overline{H}_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16155</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16155"/>
		<updated>2016-11-08T15:45:09Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Ортогонализация Арнольди */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; \{b, Ab, A^2b, \ldots, A^{m-1}b\} &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_m = V_mH_m + h_{m+1m}v_{m+1} e_m^T = V_{m+1}\overline{H}_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16154</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16154"/>
		<updated>2016-11-08T15:44:28Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Ортогонализация Арнольди */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результат процедуры Арнольди совпадает с результатом процесса Грамма-Шмидта, применённого к векторам &amp;lt;math&amp;gt; b, Ab, A^2b, \ldots, A^{m-1}b &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_m = V_mH_m + h_{m+1m}v_{m+1} e_m^T = V_{m+1}\overline{H}_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16153</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16153"/>
		<updated>2016-11-08T15:22:22Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Ортогонализация Арнольди */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
Идея процесса Арнольди состоит в том, что для нахождения вектора &amp;lt;math&amp;gt; v_{j+1} &amp;lt;/math&amp;gt; при известных векторах &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt; необходимо вычислить вектор &amp;lt;math&amp;gt; Av_j &amp;lt;/math&amp;gt; и ортонормировать этот вектор относительно &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_j &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{\|\hat{v}_{j+1}\|_2} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Коэффициенты &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i) &amp;lt;/math&amp;gt; определяются из условия ортогональности:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt; A(v_j, v_k) - \sum_{i=1}^j h_{ij}(v_{i}, v_k)  = 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \quad k=1,\ldots,j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1, v_2, \ldots, v_m &amp;lt;/math&amp;gt; - ортонормированный базис пространства Крылова &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_m = V_mH_m + h_{m+1m}v_{m+1} e_m^T = V_{m+1}\overline{H}_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16150</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16150"/>
		<updated>2016-11-08T12:55:36Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Ортогонализация Арнольди */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
# &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_m = V_mH_m + h_{m+1m}v_{m+1} e_m^T = V_{m+1}\overline{H}_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16149</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16149"/>
		<updated>2016-11-08T12:53:47Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует Евклидову норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_m = V_mH_m + h_{m+1m}v_{m+1} e_m^T = V_{m+1}\overline{H}_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление Евклидовой нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16148</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=16148"/>
		<updated>2016-11-08T12:51:09Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \operatorname{span} \, \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt; - линейная оболочка системы векторов &amp;lt;math&amp;gt; \{ a_1, a_2, \ldots, a_k \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_m = V_mH_m + h_{m+1m}v_{m+1} e_m^T = V_{m+1}\overline{H}_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
В статье &amp;lt;ref&amp;gt; M. Sosonkina, Donald C. S. Allison, Layne T. Watson: Scalability analysis of parallel GMRES implementations &amp;lt;/ref&amp;gt; анализируется параллельная реализация &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; на Intel Paragon, IBM SP2 и Cray T3E. &lt;br /&gt;
Системы Intel Paragon и IBM SP2 не имеют двухуровневого кэша, что значительно сказывается на времени работы из-за больших потерь скорости и частых обращений к памяти.&lt;br /&gt;
В Cray T3E каждый процессор соединен с 8-килобайтовым кэшем данных и 96-килобайтовым двухуровневым кэшем данных. Также имеется дополнительный кэш объемом 4 мегабайта. Это достаточная емкость кэш-памяти для хранения всех данных с плавающей точкой с высоким коэффициентом попаданий кэша.&lt;br /&gt;
&lt;br /&gt;
Ниже представлены графики экспериментальных результатов, где штриховыми линиями указывается теоретическая связь между коэффициентом масштабируемости &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; и числом процессоров &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; для фиксированного значения эффективности. Сплошная линия является аппроксимацией экспериментальных данных методом наименьших квадратов. На всех графиках вертикальная ось представляет &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, а горизонтальная ось - &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Intel paragon.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 2&#039;&#039;&#039; Intel Paragon]]&lt;br /&gt;
[[File:Ibm sp2.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 3&#039;&#039;&#039; IBM SP2]]&lt;br /&gt;
[[File:Cray t3e.JPG|thumb|center|800px|&#039;&#039;&#039;Рис. 4&#039;&#039;&#039; Cray T3E]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теоретические и экспериментальные результаты показывают, что параллельные реализации &amp;lt;math&amp;gt;GMRES(k)&amp;lt;/math&amp;gt; являются достаточно масштабируемыми.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=14505</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=14505"/>
		<updated>2016-10-28T13:59:27Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_m = V_mH_m + h_{m+1m}v_{m+1} e_m^T = V_{m+1}\overline{H}_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
[[File: Drawing.png|thumb|center|350px|&#039;&#039;&#039;Рис. 1&#039;&#039;&#039; &lt;br /&gt;
&#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt;&#039;&#039;&#039; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации; &lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.]]&lt;br /&gt;
Шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=14178</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=14178"/>
		<updated>2016-10-27T12:38:19Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
=== Ортогонализация Арнольди ===&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_m = V_mH_m + h_{m+1m}v_{m+1} e_m^T = V_{m+1}\overline{H}_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Минимизация функционала невязки ===&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
=== Общая схема метода ===&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
----&lt;br /&gt;
[[File: Drawing.png|300px|caption]]&lt;br /&gt;
----&lt;br /&gt;
На информационном графе:&lt;br /&gt;
* &#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
* &amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации;&lt;br /&gt;
* &#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.&lt;br /&gt;
&lt;br /&gt;
При этом, шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=14176</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=14176"/>
		<updated>2016-10-27T12:37:12Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_m = V_mH_m + h_{m+1m}v_{m+1} e_m^T = V_{m+1}\overline{H}_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
----&lt;br /&gt;
[[File: Drawing.png|300px|caption]]&lt;br /&gt;
----&lt;br /&gt;
На информационном графе:&lt;br /&gt;
* &#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
* &amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации;&lt;br /&gt;
* &#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.&lt;br /&gt;
&lt;br /&gt;
При этом, шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Свойства алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Обобщенный метод минимальных невязок предназначен для решения несимметричных систем линейных уравнений. GMRES использует перезазапуски для контроля требований к хранению данных.&lt;br /&gt;
&lt;br /&gt;
Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов. Но это не имеет практического применения, когда &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; велико. Кроме того, требования к памяти и вычислениям при отсутствии перезапусков являются очень высокими. Важнейшим элементом для успешного применения &amp;lt;math&amp;gt; GMRES(m)&amp;lt;/math&amp;gt; являются перезапуски; то есть выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&lt;br /&gt;
&lt;br /&gt;
Основным недостатком GMRES является то, что объемы работ и ресурсы памяти, требуемые для итерации, линейно возрастают с увеличением числа итераций. Если не удалось получить чрезвычайно быструю сходимость - затраты будут очень высокими. Основной способ преодолеть это ограничение - это перезапуск итерации. После выбранного числа итераций &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; накопленные данные будут очищены и промежуточные результаты используются в качестве входных данных для последующих итераций. Эта процедура повторяется до тех пор, пока сходимость не будет достигнута. Трудность заключается в выборе подходящего значения &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; слишком мало, &amp;lt;math&amp;gt;GMRES(m)&amp;lt;/math&amp;gt;  может быть медленно сходиться, или не сойтись совсем. Значение &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;, большее, чем это необходимо, включает в себя чрезмерную работы и использует больше памяти. К сожалению, нет определенных правил, регулирующих выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;; выбирая , когда делать перезапуск - это вопрос опыта.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13115</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13115"/>
		<updated>2016-10-18T16:38:00Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_m = V_mH_m + h_{m+1m}v_{m+1} e_m^T = V_{m+1}\overline{H}_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
----&lt;br /&gt;
[[File: Drawing.png|300px|caption]]&lt;br /&gt;
----&lt;br /&gt;
На информационном графе:&lt;br /&gt;
* &#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
* &amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой итерации;&lt;br /&gt;
* &#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.&lt;br /&gt;
&lt;br /&gt;
При этом, шаги алгоритма Арнольди выполняются строго последовательно, но вычисление &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt;-ой невязки может происходить параллельно&lt;br /&gt;
с &amp;lt;math&amp;gt; (i + 1) &amp;lt;/math&amp;gt;-ым шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому ожидается, что при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций, повысится эффективность метода в целом. Достигнуть этого можно, применив при выполнении перечисленных операций аппарат параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13114</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13114"/>
		<updated>2016-10-18T16:33:45Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_m = Ax_m - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_m = K_m(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{m-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + z_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_m \in K_m &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_m = V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_m \in \mathbb{R}^m &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_m = V_mH_m + h_{m+1m}v_{m+1} e_m^T = V_{m+1}\overline{H}_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_m = [v_1|v_2|...|v_m] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_m\|_2 = \|b - A(x_0 + V_my)\|_2 = \|\beta e_1 - \overline{H}_my_m \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; m+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_m = \arg\min_{y}\| \beta e_1 - \overline{H}_my\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_m &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде m-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_m &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_m\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
----&lt;br /&gt;
[[File: Drawing.png|300px|caption]]&lt;br /&gt;
----&lt;br /&gt;
Здесь &#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на i-той итерации;&lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.&lt;br /&gt;
&lt;br /&gt;
При этом, шаги алгоритма Арнольди выполняются строго последовательно, но вычисление i-той невязки может происходить параллельно&lt;br /&gt;
с (i+1)-м шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В ходе анализа перезапускаемого метода обобщенных минимальных невязок был выявлен ряд подзадач, выполняющихся неоднократно: умножение матрицы на вектор, вычисление скалярного произведения векторов, нахождение нормы вектора, нормирование вектора, нахождение взвешенной суммы векторов. Наиболее трудоемкой среди перечисленных операций является умножение матрицы на вектор.&lt;br /&gt;
&lt;br /&gt;
Выполнение перечисленных операций занимает большую часть времени работы алгоритма GMRES. Поэтому ожидается, что при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций, повысится эффективность метода в целом. Достигнуть этого можно, применив при выполнении перечисленных операций аппарат параллельных вычислений.&lt;br /&gt;
&lt;br /&gt;
При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры. Для рассматриваемой задачи решения СЛАУ такой подход распределения допустим, т.к. векторы содержат столько же элементов, сколько и одна строка или один столбец матрицы коэффициентов.&lt;br /&gt;
&lt;br /&gt;
Подзадачи можно разделить на 2 группы: операции между матрицей и вектором (например, умножение матрицы на вектор) и операции между двумя векторами (например, скалярное умножение). Подзадачи умножения константы на вектор и определение нормы вектора можно относить ко второй группе, так как их трудоемкость одного порядка.&lt;br /&gt;
&lt;br /&gt;
Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13082</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13082"/>
		<updated>2016-10-17T22:53:05Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
         [[File: Drawing.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Здесь &#039;&#039;&#039;input&#039;&#039;&#039; - входные данные алгоритма (квадратная матрица, вектор правой части, начальное приближение, точность решения);&lt;br /&gt;
&amp;lt;math&amp;gt; A_i &amp;lt;/math&amp;gt; - шаги алгоритма Арнольди, &amp;lt;math&amp;gt; x_i &amp;lt;/math&amp;gt; - нахождение невязки на i-той итерации;&lt;br /&gt;
&#039;&#039;&#039;if&#039;&#039;&#039; - вычисление &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и в случае достижения нужной точности - остановка.&lt;br /&gt;
&lt;br /&gt;
При этом, шаги алгоритма Арнольди выполняются строго последовательно, но вычисление i-той невязки может происходить параллельно&lt;br /&gt;
с (i+1)-м шагом алгоритма Арнольди.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13048</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13048"/>
		<updated>2016-10-17T19:39:53Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[#Участник:Kpetrov|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ Библиотека LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13034</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13034"/>
		<updated>2016-10-17T17:44:28Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]), [[Участник:nop|К.Петров]] (разделы [[#Информационный граф|1.7]], [[#Ресурс параллелизма алгоритма|1.8]], [[#Свойства алгоритма|1.10]], [[#Масштабируемость алгоритма и его реализации|2.4]]).&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ Библиотека LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13033</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13033"/>
		<updated>2016-10-17T17:18:28Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
Основные авторы описания: [[#Участник:Alexander34396|А.А.Ульянов]] (разделы [[#Общее описание алгоритма|1.1]], [[#Математическое описание алгоритма|1.2]], [[#Вычислительное ядро алгоритма|1.3]], [[#Макроструктура алгоритма|1.4]], [[#Схема реализации последовательного алгоритма|1.5]], [[#Последовательная сложность алгоритма|1.6]], [[#Входные и выходные данные алгоритма|1.9]], [[#Существующие реализации алгоритма|2.7]]).&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ Библиотека LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13032</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13032"/>
		<updated>2016-10-17T17:01:49Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Обобщенный метод минимальных невязок&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt; (n + 1)^2 &amp;lt;/math&amp;gt;&lt;br /&gt;
| output_data       = &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ Библиотека LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13031</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13031"/>
		<updated>2016-10-17T16:58:58Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; m &amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ Библиотека LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13030</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13030"/>
		<updated>2016-10-17T16:58:37Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_m, j &amp;lt; k&amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(m + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nm &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ Библиотека LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13029</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13029"/>
		<updated>2016-10-17T16:57:27Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_k, j &amp;lt; k&amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; O(nm^2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nk &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ Библиотека LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13022</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13022"/>
		<updated>2016-10-17T15:54:13Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_k, j &amp;lt; k&amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; nk(k + 1) + kNZ  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nk &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ Библиотека LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13018</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13018"/>
		<updated>2016-10-17T15:41:59Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_k, j &amp;lt; k&amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; nk(k + 1) + kNZ  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nk &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ Библиотека LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
* [http://osl.iu.edu/research/mtl/ MTL]&lt;br /&gt;
* [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/ SPARSKIT]&lt;br /&gt;
* [http://researcher.watson.ibm.com/researcher/view_group.php?id=1426 WSMP]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13014</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13014"/>
		<updated>2016-10-17T15:35:38Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_k, j &amp;lt; k&amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; nk(k + 1) + kNZ  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nk &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных пакетах: &lt;br /&gt;
* [http://www.netlib.org/linpack/ Библиотека LINPACK]&lt;br /&gt;
* [http://math.nist.gov/tnt/download.html/ JAMA/C++] &lt;br /&gt;
* [http://math-atlas.sourceforge.net/ ATLAS] &lt;br /&gt;
* [http://software.intel.com/mkl‎/ Intel MLK]&lt;br /&gt;
* [http://math.nist.gov/iml++/ IML++]&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13008</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13008"/>
		<updated>2016-10-17T15:09:50Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_k, j &amp;lt; k&amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; nk(k + 1) + kNZ  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nk &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13007</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13007"/>
		<updated>2016-10-17T15:09:32Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Локальность данных и вычислений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_k, j &amp;lt; k&amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; nk(k + 1) + kNZ  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nk &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13006</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13006"/>
		<updated>2016-10-17T15:08:54Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_k, j &amp;lt; k&amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; nk(k + 1) + kNZ  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nk &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
&lt;br /&gt;
==== Локальность реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Структура обращений в память и качественная оценка локальности ====&lt;br /&gt;
&lt;br /&gt;
==== Количественная оценка локальности ====&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость алгоритма ====&lt;br /&gt;
&lt;br /&gt;
==== Масштабируемость реализации алгоритма ====&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13005</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13005"/>
		<updated>2016-10-17T15:01:57Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Схема реализации перезапускаемого GMRES */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_k, j &amp;lt; k&amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; nk(k + 1) + kNZ  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nk &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13004</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13004"/>
		<updated>2016-10-17T15:01:34Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Схема реализации классического GMRES */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Схема реализации перезапускаемого GMRES ====&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_k, j &amp;lt; k&amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; nk(k + 1) + kNZ  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nk &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13003</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=13003"/>
		<updated>2016-10-17T15:00:07Z</updated>

		<summary type="html">&lt;p&gt;Alexander34396: /* Схема реализации классического GMRES */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обобщённый метод минимальных невязок&#039;&#039;&#039; ({{lang-en|Generalized minimal residual method, GMRES}}) - итерационный метод численного решения системы линейных алгебраических уравнений с невырожденной матрицей. Метод основан на минимизации квадратичного функционала невязки на подпространствах Крылова. Разработан Юсефом Саадом и Мартином Шульцем&amp;lt;ref&amp;gt; Y.Saad, M.H. Schultz, GMRES: A generalized minimal residual algorithm for solving nonsymmetric linear systems, SIAM J. Scientific and Stat. Comp. 7: 856-869 (1986) &amp;lt;/ref&amp;gt; в 1986 году как обобщение метода MINRES&amp;lt;ref&amp;gt;C. C. Paige and M. A. Saunders. Solution of sparse indefinite systems of linear equations, SIAM J. Numerical Analysis 12, 617-629 (1975)&amp;lt;/ref&amp;gt; на случай систем с несимметричными матрицами.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* система линейных алгебраических уравнений вида &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; — невырожденная матрица размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - начальное приближение.&lt;br /&gt;
&#039;&#039;&#039;Вычисляемые данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - приближённое решение исходной системы.&lt;br /&gt;
&lt;br /&gt;
Метод GMRES приближает точное решение исходной системы &amp;lt;math&amp;gt; Ax = b &amp;lt;/math&amp;gt; вектором &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, который минимизирует &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-норму невязки &amp;lt;math&amp;gt; r_k = Ax_k - b&amp;lt;/math&amp;gt; на подпространстве Крылова:&lt;br /&gt;
: &amp;lt;math&amp;gt; K_k = K_k(A,b) = \operatorname{span} \, \{ b, Ab, A^2b, \ldots, A^{k-1}b \} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации метода решение уточняется поправкой, представленной в виде разложения по &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-ортонормированному базису пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + z_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; - некоторое начальное приближение, &amp;lt;math&amp;gt; z_k \in K_k &amp;lt;/math&amp;gt; - поправка решения.&lt;br /&gt;
&lt;br /&gt;
==== Ортогонализация Арнольди ====&lt;br /&gt;
&lt;br /&gt;
Для построения ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Исходные данные:&#039;&#039;&#039; &lt;br /&gt;
* &amp;lt;math&amp;gt; v_1 &amp;lt;/math&amp;gt;, такой что &amp;lt;math&amp;gt; \|v_1\|_2 = 1 &amp;lt;/math&amp;gt;;&lt;br /&gt;
* матрица &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; размером &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Формула процесса:&#039;&#039;&#039;&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Алгоритм процесса:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Выполнять для &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; \hat{v}_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При введении матричных обозначений можно записать:&#039;&#039;&#039; &lt;br /&gt;
# &amp;lt;math&amp;gt; z_k = V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; y_k \in \mathbb{R}^k &amp;lt;/math&amp;gt; - вектор коэффициентов;&lt;br /&gt;
# &amp;lt;math&amp;gt; AV_k = V_kH_k + h_{k+1k}v_{k+1} e_k^T = V_{k+1}\overline{H}_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; V_k = [v_1|v_2|...|v_k] &amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; - верхняя матрица Хессенберга размерности &amp;lt;math&amp;gt; (j+1) &amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Минимизация функционала невязки ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы GMRES вычисляет приближённое решение &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;, которое минимизизует функционал невязки:&lt;br /&gt;
: &amp;lt;math&amp;gt; J(y) = \|b- A x_k\|_2 = \|b - A(x_0 + V_ky)\|_2 = \|\beta e_1 - \overline{H}_ky_k \|_2 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; \beta = \|r_0\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вектор &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt; может найден как решение линейной задачи наименьших квадратов размера &amp;lt;math&amp;gt; k+1 &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
: &amp;lt;math&amp;gt; y_k = \arg\min_{y}\| \beta e_1 - \overline{H}_ky\|_2 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для решения задачи матрица &amp;lt;math&amp;gt; \overline{H}_k &amp;lt;/math&amp;gt; приводится к верхнему треугольному виду с помощью &amp;lt;math&amp;gt; k &amp;lt;/math&amp;gt; последовательных вращений Гивенса.&lt;br /&gt;
&lt;br /&gt;
==== Общая схема метода ====&lt;br /&gt;
&lt;br /&gt;
В общем виде k-aя итерация алгоритма GMRES может быть записан следующим образом:&lt;br /&gt;
&lt;br /&gt;
# найти ортонормированный базис &amp;lt;math&amp;gt; V_k &amp;lt;/math&amp;gt; подпространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; с помощью ортогонализации Арнольди;&lt;br /&gt;
# найти &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, минимизирующий &amp;lt;math&amp;gt; \|r_k\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
# вычислить &amp;lt;math&amp;gt; r_k &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Вычислительное ядро последовательной версии метода GMRES состоит из двух частей:&lt;br /&gt;
* Вычисление ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;;&lt;br /&gt;
* Формирование приближенного решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt; метод использует процесс Арнольди:&lt;br /&gt;
: &amp;lt;math&amp;gt; h_{j+1j}v_{j+1} = Av_j - \sum_{i=1}^j h_{ij}v_{j} &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt; h_{ij} = (Av_j, v_i)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \quad j=1,\ldots,k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для нахождения приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; метод использует формулу:&lt;br /&gt;
: &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
&lt;br /&gt;
В алгоритме можно выделить следующие макрооперации:&lt;br /&gt;
&lt;br /&gt;
* Умножение матрицы на вектор;&lt;br /&gt;
* Вычисление скалярного произведения векторов;&lt;br /&gt;
* Вычисление &amp;lt;math&amp;gt; l_2 &amp;lt;/math&amp;gt;-нормы вектора;&lt;br /&gt;
* Умножение вектора на скаляр;&lt;br /&gt;
* Деление вектора на скаляр.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
==== Схема реализации классического GMRES ====&lt;br /&gt;
&lt;br /&gt;
Для решения исходной системы методом GMRES можно воспользоваться следующим алгоритмом:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
# Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
# Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;k-ая итерация:&#039;&#039;&#039;&lt;br /&gt;
# Вычисление ортонормированного базиса с помощью процесса Арнольди;&lt;br /&gt;
# &amp;lt;math&amp;gt; x_k = x_0 + V_ky_k &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_k&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_ky_k\|_2&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Схема реализации перезапускаемого GMRES ====&lt;br /&gt;
&lt;br /&gt;
На практике используется перезапускаемая версия метода - GMRES(m):&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;1 Подготовка перед итерационным процессом:&#039;&#039;&#039;&lt;br /&gt;
:1.1 Выбрать начальное приближение &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.2 Посчитать невязку &amp;lt;math&amp;gt; r_0 = b - Ax_0 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:1.3 Вычислить &amp;lt;math&amp;gt; v_1 = \frac{r_0}{\|r_0\|_2} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2 Построение ортонормированного базиса &amp;lt;math&amp;gt; K_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
: Для всех &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; от 1 до m по нарастанию выполнять:&lt;br /&gt;
:2.1 &amp;lt;math&amp;gt; h_{ij} := (Av_j, v_i), \quad i=1,\ldots,j &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.2 &amp;lt;math&amp;gt; \hat{v}_{j+1} := Av_j - \sum_{i=1}^j h_{ij}v_{i} &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.3 &amp;lt;math&amp;gt; h_{j+1j} = \|\hat{v}_{j+1}\|_2 &amp;lt;/math&amp;gt;;&lt;br /&gt;
:2.4 &amp;lt;math&amp;gt; v_{j+1} = \frac{\hat{v}_{j+1}}{h_{j+1j}} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3 Вычисление &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:3.1 &amp;lt;math&amp;gt; x_m = x_0 + V_my_m &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;y_m&amp;lt;/math&amp;gt; минимизирует &amp;lt;math&amp;gt;\|r_0 - AV_my_m\|_2&amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.2 Вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt;;&lt;br /&gt;
:3.3 Если требуемая точность достигнута, остановиться.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4 Перезапуск:&#039;&#039;&#039;&lt;br /&gt;
:4.1 &amp;lt;math&amp;gt;x_0 = x_m&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.2 &amp;lt;math&amp;gt;v_1 = \frac{r_m}{\|r_m\|_2}&amp;lt;/math&amp;gt;;&lt;br /&gt;
:4.3 Перейти к шагу 2.&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_k &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Сложность вычисления ортонормированного базиса пространства &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
:a) Для вычисления &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;-го вектора базиса &amp;lt;math&amp;gt; K_k, j &amp;lt; k&amp;lt;/math&amp;gt; требуется:&lt;br /&gt;
:: &amp;lt;math&amp;gt; NZ + (2j + 1)n &amp;lt;/math&amp;gt; мультипликативных операций, где &amp;lt;math&amp;gt; NZ &amp;lt;/math&amp;gt; - количество ненулевых элементов матрицы &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt;. &lt;br /&gt;
:b) Вычисление последнего вектора базиса требует:&lt;br /&gt;
:: &amp;lt;math&amp;gt; n(k + 1) &amp;lt;/math&amp;gt; мультипликативных операций. &lt;br /&gt;
:c) Общая мультипликативная сложность вычисления ортонормированного базиса &amp;lt;math&amp;gt; K_k &amp;lt;/math&amp;gt;: &lt;br /&gt;
:: &amp;lt;math&amp;gt; nk(k + 1) + kNZ  &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Сложность вычисления приближённого решения &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt;:&#039;&#039;&#039; &lt;br /&gt;
:a) Вычисление этой формулы требует &amp;lt;math&amp;gt; nk &amp;lt;/math&amp;gt; мультипликативных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; A &amp;lt;/math&amp;gt; – квадратная матрица размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-&amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;math&amp;gt; b &amp;lt;/math&amp;gt; – вектор правой части размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1; &lt;br /&gt;
* &amp;lt;math&amp;gt; x_0 &amp;lt;/math&amp;gt; – начальное приближение размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1;&lt;br /&gt;
* &amp;lt;math&amp;gt; \epsilon &amp;lt;/math&amp;gt; – погрешность решения.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для перезапускаемой версии алгоритма дополнительно:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; – число итераций.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n^2 + 2n + 1 &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
* &amp;lt;math&amp;gt; x_k &amp;lt;/math&amp;gt; - вектор приближённого решения размера &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;-на-1.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём выходных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
&amp;lt;references \&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alexander34396</name></author>
	</entry>
</feed>