<?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=Lvs</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=Lvs"/>
	<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/Lvs"/>
	<updated>2026-10-22T21:00:06Z</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20091</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20091"/>
		<updated>2016-12-05T11:42:11Z</updated>

		<summary type="html">&lt;p&gt;Lvs: &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;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
# Значение первого вектора выбирается как &amp;lt;math&amp;gt;q_1 = b / ||b||&amp;lt;/math&amp;gt;&lt;br /&gt;
# Оставшиеся векторы &amp;lt;math&amp;gt;q_j, j = 2 .. n&amp;lt;/math&amp;gt; считаются по такому плану:&lt;br /&gt;
## Вычисляется вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; путём умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на предыдущий вектор &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = Aq_{j-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Вычисляются значения &amp;lt;math&amp;gt;h_{ij-1}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i = 1 .. j - 1&amp;lt;/math&amp;gt; как скалярное произведение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{ij-1} = (z, q_i)&amp;lt;/math&amp;gt;. После каждого такого вычисления значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; понижается на &amp;lt;math&amp;gt;h_{ij-1} q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = z - h_{ij-1} q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## Затем вычисляется значение &amp;lt;math&amp;gt;h_{jj-1}&amp;lt;/math&amp;gt; как норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{jj-1} = ||z||&amp;lt;/math&amp;gt;. Алгоритм останавливается, если эта норма равна 0&lt;br /&gt;
## Если полученное значение нормы не равно 0, то &amp;lt;math&amp;gt;q_j = z /||z||&amp;lt;/math&amp;gt; (что эквивалентно &amp;lt;math&amp;gt;q_j = z /h_{jj-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Получаемые в процессе работы алгоритма векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt; образуют искомый ортонормированный базис Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_m = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Самая трудоёмкая и самая часто вызываемая операция в алгоритме - умножение матрицы на вектор. В первую очередь это связано с вычислением матрицы Хессенберга и ортонормированного базиса подпространства Крылова.&lt;br /&gt;
Число умножений матрицы на вектор: &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; в алгоритме Арнольди, K в выбранном алгоритме решения задачи минимальных квадратов и 1 в подсчёте результата.&lt;br /&gt;
Также в алгоритм входят &amp;lt;math&amp;gt;n*(n-1) / 2&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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение (минимальную норму вектора невязки)&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор, поскольку является самым ресурсоёмким, но при этом умножать отдельные строки матрицы можно независимо друг от друга. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Операция вычисления скалярного произведения&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычислений возможно оптимально выполнять итерации алгоритма последовательно, вычисляя параллельно только векторно-матричные произведения.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Эта реализация использует многопроцессорное выполнение с общей памятью и вычисляет параллельно скалярное произведение и умножение матрицы на вектор. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448 с 1921955 ненулевыми элементами, расположенными около главной диагонали. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Надо заметить, что для этой матрицы на таком числе итераций решения с заданной точностью найдено не было. Она была выбрана с целью показать масштабируемость алгоритма. На матрицах более малого размера решение находится быстро.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20090</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20090"/>
		<updated>2016-12-05T11:41:36Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Метод минимальных невязок используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Приближённое решение в методе получается с помощью вектора в подпространстве Крылова. Для нахождения этого вектора используется алгоритм Арнольди, посредством которого матрица СЛАУ приводится к (верхней) хессенберговой форме. На основе этой формы происходит минимизация невязки.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
# Значение первого вектора выбирается как &amp;lt;math&amp;gt;q_1 = b / ||b||&amp;lt;/math&amp;gt;&lt;br /&gt;
# Оставшиеся векторы &amp;lt;math&amp;gt;q_j, j = 2 .. n&amp;lt;/math&amp;gt; считаются по такому плану:&lt;br /&gt;
## Вычисляется вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; путём умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на предыдущий вектор &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = Aq_{j-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Вычисляются значения &amp;lt;math&amp;gt;h_{ij-1}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i = 1 .. j - 1&amp;lt;/math&amp;gt; как скалярное произведение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{ij-1} = (z, q_i)&amp;lt;/math&amp;gt;. После каждого такого вычисления значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; понижается на &amp;lt;math&amp;gt;h_{ij-1} q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = z - h_{ij-1} q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## Затем вычисляется значение &amp;lt;math&amp;gt;h_{jj-1}&amp;lt;/math&amp;gt; как норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{jj-1} = ||z||&amp;lt;/math&amp;gt;. Алгоритм останавливается, если эта норма равна 0&lt;br /&gt;
## Если полученное значение нормы не равно 0, то &amp;lt;math&amp;gt;q_j = z /||z||&amp;lt;/math&amp;gt; (что эквивалентно &amp;lt;math&amp;gt;q_j = z /h_{jj-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Получаемые в процессе работы алгоритма векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt; образуют искомый ортонормированный базис Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_m = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Самая трудоёмкая и самая часто вызываемая операция в алгоритме - умножение матрицы на вектор. В первую очередь это связано с вычислением матрицы Хессенберга и ортонормированного базиса подпространства Крылова.&lt;br /&gt;
Число умножений матрицы на вектор: &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; в алгоритме Арнольди, K в выбранном алгоритме решения задачи минимальных квадратов и 1 в подсчёте результата.&lt;br /&gt;
Также в алгоритм входят &amp;lt;math&amp;gt;n*(n-1) / 2&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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение (минимальную норму вектора невязки)&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор, поскольку является самым ресурсоёмким, но при этом умножать отдельные строки матрицы можно независимо друг от друга. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Операция вычисления скалярного произведения&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычислений возможно оптимально выполнять итерации алгоритма последовательно, вычисляя параллельно только векторно-матричные произведения.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Эта реализация использует многопроцессорное выполнение с общей памятью и вычисляет параллельно скалярное произведение и умножение матрицы на вектор. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448 с 1921955 ненулевыми элементами, расположенными около главной диагонали. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Надо заметить, что для этой матрицы на таком числе итераций решения с заданной точностью найдено не было. Она была выбрана с целью показать масштабируемость алгоритма. На матрицах более малого размера решение находится быстро.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20089</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20089"/>
		<updated>2016-12-05T11:32:40Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
# Значение первого вектора выбирается как &amp;lt;math&amp;gt;q_1 = b / ||b||&amp;lt;/math&amp;gt;&lt;br /&gt;
# Оставшиеся векторы &amp;lt;math&amp;gt;q_j, j = 2 .. n&amp;lt;/math&amp;gt; считаются по такому плану:&lt;br /&gt;
## Вычисляется вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; путём умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на предыдущий вектор &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = Aq_{j-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Вычисляются значения &amp;lt;math&amp;gt;h_{ij-1}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i = 1 .. j - 1&amp;lt;/math&amp;gt; как скалярное произведение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{ij-1} = (z, q_i)&amp;lt;/math&amp;gt;. После каждого такого вычисления значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; понижается на &amp;lt;math&amp;gt;h_{ij-1} q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = z - h_{ij-1} q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## Затем вычисляется значение &amp;lt;math&amp;gt;h_{jj-1}&amp;lt;/math&amp;gt; как норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{jj-1} = ||z||&amp;lt;/math&amp;gt;. Алгоритм останавливается, если эта норма равна 0&lt;br /&gt;
## Если полученное значение нормы не равно 0, то &amp;lt;math&amp;gt;q_j = z /||z||&amp;lt;/math&amp;gt; (что эквивалентно &amp;lt;math&amp;gt;q_j = z /h_{jj-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Получаемые в процессе работы алгоритма векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt; образуют искомый ортонормированный базис Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_m = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Самая трудоёмкая и самая часто вызываемая операция в алгоритме - умножение матрицы на вектор. В первую очередь это связано с вычислением матрицы Хессенберга и ортонормированного базиса подпространства Крылова.&lt;br /&gt;
Число умножений матрицы на вектор: &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; в алгоритме Арнольди, K в выбранном алгоритме решения задачи минимальных квадратов и 1 в подсчёте результата.&lt;br /&gt;
Также в алгоритм входят &amp;lt;math&amp;gt;n*(n-1) / 2&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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение (минимальную норму вектора невязки)&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор, поскольку является самым ресурсоёмким, но при этом умножать отдельные строки матрицы можно независимо друг от друга. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Операция вычисления скалярного произведения&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычислений возможно оптимально выполнять итерации алгоритма последовательно, вычисляя параллельно только векторно-матричные произведения.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Эта реализация использует многопроцессорное выполнение с общей памятью и вычисляет параллельно скалярное произведение и умножение матрицы на вектор. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448 с 1921955 ненулевыми элементами, расположенными около главной диагонали. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Надо заметить, что для этой матрицы на таком числе итераций решения с заданной точностью найдено не было. Она была выбрана с целью показать масштабируемость алгоритма. На матрицах более малого размера решение находится быстро.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20088</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20088"/>
		<updated>2016-12-05T11:31:28Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
# Значение первого вектора выбирается как &amp;lt;math&amp;gt;q_1 = b / ||b||&amp;lt;/math&amp;gt;&lt;br /&gt;
# Оставшиеся векторы &amp;lt;math&amp;gt;q_j, j = 2 .. n&amp;lt;/math&amp;gt; считаются по такому плану:&lt;br /&gt;
## Вычисляется вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; путём умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на предыдущий вектор &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = Aq_{j-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Вычисляются значения &amp;lt;math&amp;gt;h_{ij-1}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i = 1 .. j - 1&amp;lt;/math&amp;gt; как скалярное произведение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{ij-1} = (z, q_i)&amp;lt;/math&amp;gt;. После каждого такого вычисления значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; понижается на &amp;lt;math&amp;gt;h_{ij-1} q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = z - h_{ij-1} q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## Затем вычисляется значение &amp;lt;math&amp;gt;h_{jj-1}&amp;lt;/math&amp;gt; как норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{jj-1} = ||z||&amp;lt;/math&amp;gt;. Алгоритм останавливается, если эта норма равна 0&lt;br /&gt;
## Если полученное значение нормы не равно 0, то &amp;lt;math&amp;gt;q_j = z /||z||&amp;lt;/math&amp;gt; (что эквивалентно &amp;lt;math&amp;gt;q_j = z /h_{jj-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Получаемые в процессе работы алгоритма векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt; образуют искомый ортонормированный базис Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_m = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Самая трудоёмкая и самая часто вызываемая операция в алгоритме - умножение матрицы на вектор. В первую очередь это связано с вычислением матрицы Хессенберга и ортонормированного базиса подпространства Крылова.&lt;br /&gt;
Число умножений матрицы на вектор: &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; в алгоритме Арнольди, K в выбранном алгоритме решения задачи минимальных квадратов и 1 в подсчёте результата.&lt;br /&gt;
Также в алгоритм входят &amp;lt;math&amp;gt;n*(n-1) / 2&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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор, поскольку является самым ресурсоёмким, но при этом умножать отдельные строки матрицы можно независимо друг от друга. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Операция вычисления скалярного произведения&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычислений возможно оптимально выполнять итерации алгоритма последовательно, вычисляя параллельно только векторно-матричные произведения.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Эта реализация использует многопроцессорное выполнение с общей памятью и вычисляет параллельно скалярное произведение и умножение матрицы на вектор. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448 с 1921955 ненулевыми элементами, расположенными около главной диагонали. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Надо заметить, что для этой матрицы на таком числе итераций решения с заданной точностью найдено не было. Она была выбрана с целью показать масштабируемость алгоритма. На матрицах более малого размера решение находится быстро.&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20085</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20085"/>
		<updated>2016-12-05T11:20:37Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
# Значение первого вектора выбирается как &amp;lt;math&amp;gt;q_1 = b / ||b||&amp;lt;/math&amp;gt;&lt;br /&gt;
# Оставшиеся векторы &amp;lt;math&amp;gt;q_j, j = 2 .. n&amp;lt;/math&amp;gt; считаются по такому плану:&lt;br /&gt;
## Вычисляется вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; путём умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на предыдущий вектор &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = Aq_{j-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Вычисляются значения &amp;lt;math&amp;gt;h_{ij-1}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i = 1 .. j - 1&amp;lt;/math&amp;gt; как скалярное произведение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{ij-1} = (z, q_i)&amp;lt;/math&amp;gt;. После каждого такого вычисления значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; понижается на &amp;lt;math&amp;gt;h_{ij-1} q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = z - h_{ij-1} q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## Затем вычисляется значение &amp;lt;math&amp;gt;h_{jj-1}&amp;lt;/math&amp;gt; как норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{jj-1} = ||z||&amp;lt;/math&amp;gt;. Алгоритм останавливается, если эта норма равна 0&lt;br /&gt;
## Если полученное значение нормы не равно 0, то &amp;lt;math&amp;gt;q_j = z /||z||&amp;lt;/math&amp;gt; (что эквивалентно &amp;lt;math&amp;gt;q_j = z /h_{jj-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Получаемые в процессе работы алгоритма векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt; образуют искомый ортонормированный базис Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_m = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Самая трудоёмкая и самая часто вызываемая операция в алгоритме - умножение матрицы на вектор. В первую очередь это связано с вычислением матрицы Хессенберга и ортонормированного базиса подпространства Крылова.&lt;br /&gt;
Число умножений матрицы на вектор: &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; в алгоритме Арнольди, K в выбранном алгоритме решения задачи минимальных квадратов и 1 в подсчёте результата.&lt;br /&gt;
Также в алгоритм входят &amp;lt;math&amp;gt;n*(n-1) / 2&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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор, поскольку является самым ресурсоёмким, но при этом умножать отдельные строки матрицы можно независимо друг от друга. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Операция вычисления скалярного произведения&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычислений возможно оптимально выполнять итерации алгоритма последовательно, вычисляя параллельно только векторно-матричные произведения.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20084</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20084"/>
		<updated>2016-12-05T11:18:28Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
# Значение первого вектора выбирается как &amp;lt;math&amp;gt;q_1 = b / ||b||&amp;lt;/math&amp;gt;&lt;br /&gt;
# Оставшиеся векторы &amp;lt;math&amp;gt;q_j, j = 2 .. n&amp;lt;/math&amp;gt; считаются по такому плану:&lt;br /&gt;
## Вычисляется вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; путём умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на предыдущий вектор &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = Aq_{j-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Вычисляются значения &amp;lt;math&amp;gt;h_{ij-1}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i = 1 .. j - 1&amp;lt;/math&amp;gt; как скалярное произведение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{ij-1} = (z, q_i)&amp;lt;/math&amp;gt;. После каждого такого вычисления значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; понижается на &amp;lt;math&amp;gt;h_{ij-1} q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = z - h_{ij-1} q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## Затем вычисляется значение &amp;lt;math&amp;gt;h_{jj-1}&amp;lt;/math&amp;gt; как норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{jj-1} = ||z||&amp;lt;/math&amp;gt;. Алгоритм останавливается, если эта норма равна 0&lt;br /&gt;
## Если полученное значение нормы не равно 0, то &amp;lt;math&amp;gt;q_j = z /||z||&amp;lt;/math&amp;gt; (что эквивалентно &amp;lt;math&amp;gt;q_j = z /h_{jj-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Получаемые в процессе работы алгоритма векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt; образуют искомый ортонормированный базис Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_m = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Самая трудоёмкая и самая часто вызываемая операция в алгоритме - умножение матрицы на вектор. В первую очередь это связано с вычислением матрицы Хессенберга и ортонормированного базиса подпространства Крылова.&lt;br /&gt;
Число умножений матрицы на вектор: &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; в алгоритме Арнольди, K в выбранном алгоритме решения задачи минимальных квадратов и 1 в подсчёте результата.&lt;br /&gt;
Также в алгоритм входят &amp;lt;math&amp;gt;n*(n-1) / 2&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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор, поскольку является самым ресурсоёмким, но при этом умножать отдельные строки матрицы можно независимо друг от друга. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Операция вычисления скалярного произведения&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20083</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20083"/>
		<updated>2016-12-05T11:18:15Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
# Значение первого вектора выбирается как &amp;lt;math&amp;gt;q_1 = b / ||b||&amp;lt;/math&amp;gt;&lt;br /&gt;
# Оставшиеся векторы &amp;lt;math&amp;gt;q_j, j = 2 .. n&amp;lt;/math&amp;gt; считаются по такому плану:&lt;br /&gt;
## Вычисляется вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; путём умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на предыдущий вектор &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = Aq_{j-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Вычисляются значения &amp;lt;math&amp;gt;h_{ij-1}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i = 1 .. j - 1&amp;lt;/math&amp;gt; как скалярное произведение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{ij-1} = (z, q_i)&amp;lt;/math&amp;gt;. После каждого такого вычисления значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; понижается на &amp;lt;math&amp;gt;h_{ij-1} q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = z - h_{ij-1} q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## Затем вычисляется значение &amp;lt;math&amp;gt;h_{jj-1}&amp;lt;/math&amp;gt; как норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{jj-1} = ||z||&amp;lt;/math&amp;gt;. Алгоритм останавливается, если эта норма равна 0&lt;br /&gt;
## Если полученное значение нормы не равно 0, то &amp;lt;math&amp;gt;q_j = z /||z||&amp;lt;/math&amp;gt; (что эквивалентно &amp;lt;math&amp;gt;q_j = z /h_{jj-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Получаемые в процессе работы алгоритма векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt; образуют искомый ортонормированный базис Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_m = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Самая трудоёмкая и самая часто вызываемая операция в алгоритме - умножение матрицы на вектор. В первую очередь это связано с вычислением матрицы Хессенберга и ортонормированного базиса подпространства Крылова.&lt;br /&gt;
Число умножений матрицы на вектор: &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; в алгоритме Арнольди, K в выбранном алгоритме решения задачи минимальных квадратов и 1 в подсчёте результата.&lt;br /&gt;
Также в алгоритм входят &amp;lt;math&amp;gt;n*(n-1) / 2&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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор, поскольку является самым ресурсоёмким, но при этом умножать отдельные строки матрицы можно независимо друг от друга. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Операция вычисления скалярного произведения&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20082</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20082"/>
		<updated>2016-12-05T11:16:25Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
# Значение первого вектора выбирается как &amp;lt;math&amp;gt;q_1 = b / ||b||&amp;lt;/math&amp;gt;&lt;br /&gt;
# Оставшиеся векторы &amp;lt;math&amp;gt;q_j, j = 2 .. n&amp;lt;/math&amp;gt; считаются по такому плану:&lt;br /&gt;
## Вычисляется вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; путём умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на предыдущий вектор &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = Aq_{j-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Вычисляются значения &amp;lt;math&amp;gt;h_{ij-1}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i = 1 .. j - 1&amp;lt;/math&amp;gt; как скалярное произведение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{ij-1} = (z, q_i)&amp;lt;/math&amp;gt;. После каждого такого вычисления значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; понижается на &amp;lt;math&amp;gt;h_{ij-1} q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = z - h_{ij-1} q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## Затем вычисляется значение &amp;lt;math&amp;gt;h_{jj-1}&amp;lt;/math&amp;gt; как норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{jj-1} = ||z||&amp;lt;/math&amp;gt;. Алгоритм останавливается, если эта норма равна 0&lt;br /&gt;
## Если полученное значение нормы не равно 0, то &amp;lt;math&amp;gt;q_j = z /||z||&amp;lt;/math&amp;gt; (что эквивалентно &amp;lt;math&amp;gt;q_j = z /h_{jj-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Получаемые в процессе работы алгоритма векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt; образуют искомый ортонормированный базис Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_m = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Самая трудоёмкая и самая часто вызываемая операция в алгоритме - умножение матрицы на вектор. В первую очередь это связано с вычислением матрицы Хессенберга и ортонормированного базиса подпространства Крылова.&lt;br /&gt;
Число умножений матрицы на вектор: &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; в алгоритме Арнольди, K в выбранном алгоритме решения задачи минимальных квадратов и 1 в подсчёте результата.&lt;br /&gt;
Также в алгоритм входят &amp;lt;math&amp;gt;m*(m-1) / 2&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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор, поскольку является самым ресурсоёмким, но при этом умножать отдельные строки матрицы можно независимо друг от друга. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Операция вычисления скалярного произведения&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20081</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20081"/>
		<updated>2016-12-05T11:15:58Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
# Значение первого вектора выбирается как &amp;lt;math&amp;gt;q_1 = b / ||b||&amp;lt;/math&amp;gt;&lt;br /&gt;
# Оставшиеся векторы &amp;lt;math&amp;gt;q_j, j = 2 .. n&amp;lt;/math&amp;gt; считаются по такому плану:&lt;br /&gt;
## Вычисляется вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; путём умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на предыдущий вектор &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = Aq_{j-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Вычисляются значения &amp;lt;math&amp;gt;h_{ij-1}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i = 1 .. j - 1&amp;lt;/math&amp;gt; как скалярное произведение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{ij-1} = (z, q_i)&amp;lt;/math&amp;gt;. После каждого такого вычисления значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; понижается на &amp;lt;math&amp;gt;h_{ij-1} q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = z - h_{ij-1} q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## Затем вычисляется значение &amp;lt;math&amp;gt;h_{jj-1}&amp;lt;/math&amp;gt; как норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{jj-1} = ||z||&amp;lt;/math&amp;gt;. Алгоритм останавливается, если эта норма равна -&lt;br /&gt;
## Если полученное значение нормы не равно 0, то &amp;lt;math&amp;gt;q_j = z /||z||&amp;lt;/math&amp;gt; (что эквивалентно &amp;lt;math&amp;gt;q_j = z /h_{jj-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Получаемые в процессе работы алгоритма векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt; образуют искомый ортонормированный базис Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_m = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Самая трудоёмкая и самая часто вызываемая операция в алгоритме - умножение матрицы на вектор. В первую очередь это связано с вычислением матрицы Хессенберга и ортонормированного базиса подпространства Крылова.&lt;br /&gt;
Число умножений матрицы на вектор: &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; в алгоритме Арнольди, K в выбранном алгоритме решения задачи минимальных квадратов и 1 в подсчёте результата.&lt;br /&gt;
Также в алгоритм входят &amp;lt;math&amp;gt;m*(m-1) / 2&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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор, поскольку является самым ресурсоёмким, но при этом умножать отдельные строки матрицы можно независимо друг от друга. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Операция вычисления скалярного произведения&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20080</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20080"/>
		<updated>2016-12-05T11:14:06Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
# Значение первого вектора выбирается как &amp;lt;math&amp;gt;q_1 = b / ||b||&amp;lt;/math&amp;gt;&lt;br /&gt;
# Оставшиеся векторы &amp;lt;math&amp;gt;q_j, j = 2 .. m&amp;lt;/math&amp;gt; считаются по такому плану:&lt;br /&gt;
## Вычисляется вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; путём умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на предыдущий вектор &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = Aq_{j-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Вычисляются значения &amp;lt;math&amp;gt;h_{ij-1}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i = 1 .. j - 1&amp;lt;/math&amp;gt; как скалярное произведение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{ij-1} = (z, q_i)&amp;lt;/math&amp;gt;. После каждого такого вычисления значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; понижается на &amp;lt;math&amp;gt;h_{ij-1} q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = z - h_{ij-1} q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## Затем вычисляется значение &amp;lt;math&amp;gt;h_{jj-1}&amp;lt;/math&amp;gt; как норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{jj-1} = ||z||&amp;lt;/math&amp;gt;. Алгоритм останавливается, если эта норма равна -&lt;br /&gt;
## Если полученное значение нормы не равно 0, то &amp;lt;math&amp;gt;q_j = z /||z||&amp;lt;/math&amp;gt; (что эквивалентно &amp;lt;math&amp;gt;q_j = z /h_{jj-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Получаемые в процессе работы алгоритма векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt; образуют искомый ортонормированный базис Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_m = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Самая трудоёмкая и самая часто вызываемая операция в алгоритме - умножение матрицы на вектор. В первую очередь это связано с вычислением матрицы Хессенберга и ортонормированного базиса подпространства Крылова.&lt;br /&gt;
Число умножений матрицы на вектор: &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; в алгоритме Арнольди, K в выбранном алгоритме решения задачи минимальных квадратов и 1 в подсчёте результата.&lt;br /&gt;
Также в алгоритм входят &amp;lt;math&amp;gt;m*(m-1) / 2&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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор, поскольку является самым ресурсоёмким, но при этом умножать отдельные строки матрицы можно независимо друг от друга. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Операция вычисления скалярного произведения&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20079</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20079"/>
		<updated>2016-12-05T11:13:28Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
# Значение первого вектора выбирается как &amp;lt;math&amp;gt;q_1 = b / ||b||&amp;lt;/math&amp;gt;&lt;br /&gt;
# Оставшиеся векторы &amp;lt;math&amp;gt;q_j, j = 2 .. m&amp;lt;/math&amp;gt; считаются по такому плану:&lt;br /&gt;
## Вычисляется вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; путём умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на предыдущий вектор &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = Aq_{j-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Вычисляются значения &amp;lt;math&amp;gt;h_{ij-1}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i = 1 .. j - 1&amp;lt;/math&amp;gt; как скалярное произведение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{ij-1} = (z, q_i)&amp;lt;/math&amp;gt;. После каждого такого вычисления значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; понижается на &amp;lt;math&amp;gt;h_{ij-1} q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = z - h_{ij-1} q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## Затем вычисляется значение &amp;lt;math&amp;gt;h_{jj-1}&amp;lt;/math&amp;gt; как норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{jj-1} = ||z||&amp;lt;/math&amp;gt;. Алгоритм останавливается, если эта норма равна -&lt;br /&gt;
## Если полученное значение нормы не равно 0, то &amp;lt;math&amp;gt;q_j = z /||z||&amp;lt;/math&amp;gt; (что эквивалентно &amp;lt;math&amp;gt;q_j = z /h_{jj-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Получаемые в процессе работы алгоритма векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt; образуют искомый ортонормированный базис Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_m = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Самая трудоёмкая и самая часто вызываемая операция в алгоритме - умножение матрицы на вектор. В первую очередь это связано с вычислением матрицы Хессенберга и ортонормированного базиса подпространства Крылова.&lt;br /&gt;
Число умножений матрицы на вектор: &amp;lt;math&amp;gt;m-1&amp;lt;/math&amp;gt; в алгоритме Арнольди, K в выбранном алгоритме решения задачи минимальных квадратов и 1 в подсчёте результата.&lt;br /&gt;
Также в алгоритм входят &amp;lt;math&amp;gt;m*(m-1) / 2&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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор, поскольку является самым ресурсоёмким, но при этом умножать отдельные строки матрицы можно независимо друг от друга. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20076</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20076"/>
		<updated>2016-12-05T11:03:02Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
# Значение первого вектора выбирается как &amp;lt;math&amp;gt;q_1 = b / ||b||&amp;lt;/math&amp;gt;&lt;br /&gt;
# Оставшиеся векторы &amp;lt;math&amp;gt;q_j, j = 2 .. m&amp;lt;/math&amp;gt; считаются по такому плану:&lt;br /&gt;
## Вычисляется вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; путём умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на предыдущий вектор &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = Aq_{j-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Вычисляются значения &amp;lt;math&amp;gt;h_{ij-1}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i = 1 .. j - 1&amp;lt;/math&amp;gt; как скалярное произведение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{ij-1} = (z, q_i)&amp;lt;/math&amp;gt;. После каждого такого вычисления значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; понижается на &amp;lt;math&amp;gt;h_{ij-1} q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = z - h_{ij-1} q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## Затем вычисляется значение &amp;lt;math&amp;gt;h_{jj-1}&amp;lt;/math&amp;gt; как норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{jj-1} = ||z||&amp;lt;/math&amp;gt;. Алгоритм останавливается, если эта норма равна -&lt;br /&gt;
## Если полученное значение нормы не равно 0, то &amp;lt;math&amp;gt;q_j = z /||z||&amp;lt;/math&amp;gt; (что эквивалентно &amp;lt;math&amp;gt;q_j = z /h_{jj-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Получаемые в процессе работы алгоритма векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt; образуют искомый ортонормированный базис Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_m = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(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;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор, поскольку является самым ресурсоёмким, но при этом умножать отдельные строки матрицы можно независимо друг от друга. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20075</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20075"/>
		<updated>2016-12-05T11:00:01Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
# Значение первого вектора выбирается как &amp;lt;math&amp;gt;q_1 = b / ||b||&amp;lt;/math&amp;gt;&lt;br /&gt;
# Оставшиеся векторы &amp;lt;math&amp;gt;q_j, j = 2 .. m&amp;lt;/math&amp;gt; считаются по такому плану:&lt;br /&gt;
## Вычисляется вектор &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; путём умножения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; на предыдущий вектор &amp;lt;math&amp;gt;q&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = Aq_{j-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
## Вычисляются значения &amp;lt;math&amp;gt;h_{ij}&amp;lt;/math&amp;gt; для всех &amp;lt;math&amp;gt;i = 1 .. j - 1&amp;lt;/math&amp;gt; как скалярное произведение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; на вектор &amp;lt;math&amp;gt;q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{ij} = (z, q_i)&amp;lt;/math&amp;gt;. После каждого такого вычисления значение вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; понижается на &amp;lt;math&amp;gt;h_{ij} q_i&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;z = z - h_{ij} q_i&amp;lt;/math&amp;gt;&lt;br /&gt;
## Затем вычисляется значение &amp;lt;math&amp;gt;h_{jj-1}&amp;lt;/math&amp;gt; как норма вектора &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;h_{jj-1} = ||z||&amp;lt;/math&amp;gt;. Алгоритм останавливается, если эта норма равна -&lt;br /&gt;
## Если полученное значение нормы не равно 0, то &amp;lt;math&amp;gt;q_j = z /||z||&amp;lt;/math&amp;gt; (что эквивалентно &amp;lt;math&amp;gt;q_j = z /h_{jj-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Получаемые в процессе работы алгоритма векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt; образуют искомый ортонормированный базис Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_m = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(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;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор, поскольку является самым ресурсоёмким, но при этом умножать отдельные строки матрицы можно независимо друг от друга. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20067</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=20067"/>
		<updated>2016-12-05T09:53:23Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_m = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(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;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор, поскольку является самым ресурсоёмким, но при этом умножать отдельные строки матрицы можно независимо друг от друга. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs&amp;diff=19148</id>
		<title>Обсуждение участника:Lvs</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:Lvs&amp;diff=19148"/>
		<updated>2016-11-25T11:54:44Z</updated>

		<summary type="html">&lt;p&gt;Lvs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пункт 1.2 =&lt;br /&gt;
Это определение пространства Крылова?&lt;br /&gt;
Не совсем понятно описание алгоритма, если не знаешь, о чем речь&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.3 =&lt;br /&gt;
Он достаточно длинный. Посмотрите описания готовых алгоритмов на алговики. Псевдокод здесь не читается, ядро должно лучше восприниматься&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.4 =&lt;br /&gt;
Если макроструктура это указанные 3 пункта, то нужно пояснить, почему именно пункт 1 является ядром. Он самый ресурсоемкий?&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.7 =&lt;br /&gt;
Почему это основной ресурс. Это основная операция в алгоритме? Требуются пояснения&lt;br /&gt;
&lt;br /&gt;
^^ эти пункты я тоже редактировал (как-то)&lt;br /&gt;
&lt;br /&gt;
= Пункт 2.4 =&lt;br /&gt;
[[Участник:Dan|Dan]] ([[Обсуждение участника:Dan|обсуждение]]) 14:03, 23 ноября 2016 (MSK) &#039;&#039;&#039;принято&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=19147</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=19147"/>
		<updated>2016-11-25T11:54:01Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; {{Assignment|Dan}}&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор, поскольку является самым ресурсоёмким, но при этом умножать отдельные строки матрицы можно независимо друг от друга. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=19008</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=19008"/>
		<updated>2016-11-23T10:45:29Z</updated>

		<summary type="html">&lt;p&gt;Lvs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=19007</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=19007"/>
		<updated>2016-11-23T10:45:14Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
Параметры компиляции:&lt;br /&gt;
&amp;lt;code&amp;gt;mpixlc_r -qsmp=omp -O3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметры запуска:&lt;br /&gt;
&amp;lt;code&amp;gt;gmres mat.mtx void 100 0 10&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=18788</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=18788"/>
		<updated>2016-11-21T12:10:19Z</updated>

		<summary type="html">&lt;p&gt;Lvs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs&amp;diff=18787</id>
		<title>Обсуждение участника:Lvs</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:Lvs&amp;diff=18787"/>
		<updated>2016-11-21T12:09:55Z</updated>

		<summary type="html">&lt;p&gt;Lvs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пункт 1.2 =&lt;br /&gt;
Это определение пространства Крылова?&lt;br /&gt;
Не совсем понятно описание алгоритма, если не знаешь, о чем речь&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.3 =&lt;br /&gt;
Он достаточно длинный. Посмотрите описания готовых алгоритмов на алговики. Псевдокод здесь не читается, ядро должно лучше восприниматься&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.4 =&lt;br /&gt;
Если макроструктура это указанные 3 пункта, то нужно пояснить, почему именно пункт 1 является ядром. Он самый ресурсоемкий?&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.7 =&lt;br /&gt;
Почему это основной ресурс. Это основная операция в алгоритме? Требуются пояснения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Пункт 2.4 =&lt;br /&gt;
[[Участник:Dan|Dan]] ([[Обсуждение участника:Dan|обсуждение]]) 14:16, 17 ноября 2016 (MSK) необходимо доработать:&lt;br /&gt;
Требования были такие: &lt;br /&gt;
- Реализация: полностью собственная или обращение к библиотечной функции (Intel MKL, PETSc, FFTW, ScaLAPACK). В любом случае, текст исследуемой программы должен быть представлен в отчете. &lt;br /&gt;
- Компьютерная платформа может быть любой (Ломоносов, BlueGene или что-то иное). Описание компьютерной платформы должно быть в отчете. &lt;br /&gt;
- Должен быть представлен график сильной масштабируемости (зависимости производительности от числа процессов; если при этом&lt;br /&gt;
ещё и зависимость от размера задачи - это только в плюс). График должен выглядеть пристойно и понятно, оси и единицы измерения должны быть подписаны. К графику обязательно должны быть словесные пояснения! Требовалось подобрать такие размеры задачи и числа процессоров, чтобы отразить на графике характерные точки, описывающие свойства алгоритма и программы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;В ПРОЦЕССЕ!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Участник:Dan|Dan]] ([[Обсуждение участника:Dan|обсуждение]]) 10:56, 21 ноября 2016 (MSK) приведите код, параметры компиляции&lt;br /&gt;
&lt;br /&gt;
Реализация не моя, ссылку на GitHub с кодом я указал, что ещё надо?&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=18786</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=18786"/>
		<updated>2016-11-21T12:08:57Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация, найденная на просторах GitHub&amp;lt;ref&amp;gt;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=18476</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=18476"/>
		<updated>2016-11-19T14:17:58Z</updated>

		<summary type="html">&lt;p&gt;Lvs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&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;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=18475</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=18475"/>
		<updated>2016-11-19T14:16:52Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&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;Parallel GMRES Algorithm for Solving Giant Sparse System of Linear Equations https://github.com/arrgasm/paraGMRES/&amp;lt;/ref&amp;gt;. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=18474</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=18474"/>
		<updated>2016-11-19T14:14:54Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Особенности реализации последовательного алгоритма ==&lt;br /&gt;
== Локальность данных и вычислений ==&lt;br /&gt;
== Возможные способы и особенности параллельной реализации алгоритма ==&lt;br /&gt;
== Масштабируемость алгоритма и его реализации ==&lt;br /&gt;
Для исследования масштабируемости алгоритма была использована параллельная реализация [3]. Программа была запущена на суперкомпьютере BlueGene на разреженной матрице размера 90448х90448. Параметрами запуска являются 100 итераций алгоритма и 10 перезапусков алгоритм (повторный запуск алгоритма с использованием решения, полученного на предыдущем запуске, в качестве начального приближения). График зависимости времени выполнения от числа процессоров представлен на рисунке 2.&lt;br /&gt;
[[file:PlotLvs1.png|thumb|center|400px|Рис 2. График зависимости времени выполнения от числа процессоров]]&lt;br /&gt;
График эффективности для полученного времени выполнения указан на рисунке 3.&lt;br /&gt;
[[file:PlotLvs2.png|thumb|center|400px|Рис 3. График зависимости эффективности реализации от числа процессоров]]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs&amp;diff=18051</id>
		<title>Обсуждение участника:Lvs</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:Lvs&amp;diff=18051"/>
		<updated>2016-11-18T08:17:54Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Пункт 2.4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пункт 1.2 =&lt;br /&gt;
Это определение пространства Крылова?&lt;br /&gt;
Не совсем понятно описание алгоритма, если не знаешь, о чем речь&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.3 =&lt;br /&gt;
Он достаточно длинный. Посмотрите описания готовых алгоритмов на алговики. Псевдокод здесь не читается, ядро должно лучше восприниматься&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.4 =&lt;br /&gt;
Если макроструктура это указанные 3 пункта, то нужно пояснить, почему именно пункт 1 является ядром. Он самый ресурсоемкий?&lt;br /&gt;
&lt;br /&gt;
= Пункт 1.7 =&lt;br /&gt;
Почему это основной ресурс. Это основная операция в алгоритме? Требуются пояснения&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Пункт 2.4 =&lt;br /&gt;
[[Участник:Dan|Dan]] ([[Обсуждение участника:Dan|обсуждение]]) 14:16, 17 ноября 2016 (MSK) необходимо доработать:&lt;br /&gt;
&lt;br /&gt;
Требования были такие: &lt;br /&gt;
- Реализация: полностью собственная или обращение к библиотечной функции (Intel MKL, PETSc, FFTW, ScaLAPACK). В любом случае, текст исследуемой программы должен быть представлен в отчете. &lt;br /&gt;
- Компьютерная платформа может быть любой (Ломоносов, BlueGene или что-то иное). Описание компьютерной платформы должно быть в отчете. &lt;br /&gt;
- Должен быть представлен график сильной масштабируемости (зависимости производительности от числа процессов; если при этом&lt;br /&gt;
ещё и зависимость от размера задачи - это только в плюс). График должен выглядеть пристойно и понятно, оси и единицы измерения должны быть подписаны. К графику обязательно должны быть словесные пояснения! Требовалось подобрать такие размеры задачи и числа процессоров, чтобы отразить на графике характерные точки, описывающие свойства алгоритма и программы.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;В ПРОЦЕССЕ!&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=17693</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=17693"/>
		<updated>2016-11-16T13:44:38Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Свойства и структура алгоритмов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|Dan}}&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
&lt;br /&gt;
Для вычисления векторов ортонормированного базиса используется алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(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;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&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 присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=16260</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=16260"/>
		<updated>2016-11-09T13:49:01Z</updated>

		<summary type="html">&lt;p&gt;Lvs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
# Алгоритм Арнольди&lt;br /&gt;
# Решение линейной задачи минимальных квадратов&lt;br /&gt;
# Вычисление решения&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&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 присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=16259</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=16259"/>
		<updated>2016-11-09T13:48:11Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
# Алгоритм Арнольди&lt;br /&gt;
# Решение линейной задачи минимальных квадратов&lt;br /&gt;
# Вычисление решения&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Основной ресурс параллелизма - умножение матрицы на вектор. Для этой операции информационный граф представлен на рисунке.&lt;br /&gt;
&lt;br /&gt;
[[file:GraphLvs2FM.jpg|thumb|center|700px|Рис.1. Информационный граф умножения матрицы на вектор]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&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 присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=15180</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=15180"/>
		<updated>2016-10-31T16:47:04Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Источники */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
# Алгоритм Арнольди&lt;br /&gt;
# Решение линейной задачи минимальных квадратов&lt;br /&gt;
# Вычисление решения&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Информационные графы представлены на изображениях. Графы представлены для всего алгоритма и для операции умножения матрицы на вектор, которая используется в нескольких этапах алгоритма.&lt;br /&gt;
[[file:GraphLvs1.png|thumb|left|300px|Общая схема вычисления алгоритма]]&lt;br /&gt;
[[file:GraphLvs2.png|thumb|right|300px|Информационный граф вычисления произведения матрицы на вектор.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= Программная реализация алгоритма =&lt;br /&gt;
&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 присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=14713</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=14713"/>
		<updated>2016-10-29T14:11:42Z</updated>

		<summary type="html">&lt;p&gt;Lvs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
# Алгоритм Арнольди&lt;br /&gt;
# Решение линейной задачи минимальных квадратов&lt;br /&gt;
# Вычисление решения&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Информационные графы представлены на изображениях. Графы представлены для всего алгоритма и для операции умножения матрицы на вектор, которая используется в нескольких этапах алгоритма.&lt;br /&gt;
[[file:GraphLvs1.png|thumb|left|300px|Общая схема вычисления алгоритма]]&lt;br /&gt;
[[file:GraphLvs2.png|thumb|right|300px|Информационный граф вычисления произведения матрицы на вектор.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&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 присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;br /&gt;
&lt;br /&gt;
= Источники =&lt;br /&gt;
[1] Тыртышников Е. Е. Методы численного анализа — М., Академия, 2007.&lt;br /&gt;
&lt;br /&gt;
[2] М. Дана, А. Г. Зыков, Х. Д. Икрамов Метод минимальных невязок для специального класса линейных систем с нормальными матрицами коэффициентов - Ж. вычисл. матем. и матем. физ., 2005, том 45, номер 11&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=14711</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=14711"/>
		<updated>2016-10-29T14:04:36Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
# Алгоритм Арнольди&lt;br /&gt;
# Решение линейной задачи минимальных квадратов&lt;br /&gt;
# Вычисление решения&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Информационные графы представлены на изображениях. Графы представлены для всего алгоритма и для операции умножения матрицы на вектор, которая используется в нескольких этапах алгоритма.&lt;br /&gt;
[[file:GraphLvs1.png|thumb|left|300px|Общая схема вычисления алгоритма]]&lt;br /&gt;
[[file:GraphLvs2.png|thumb|right|300px|Информационный граф вычисления произведения матрицы на вектор.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&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 присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=14710</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=14710"/>
		<updated>2016-10-29T14:04:24Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
# Алгоритм Арнольди&lt;br /&gt;
# Решение линейной задачи минимальных квадратов&lt;br /&gt;
# Вычисление решения&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
Информационные графы представлены на изображениях. Графы представлены для всего алгоритма и для операции умножения матрицы на вектор, которая используется в нескольких этапах алгоритма.&lt;br /&gt;
[[file:GraphLvs1.png|thumb|left|300px|Общая схема вычисления алгоритма]]&lt;br /&gt;
[[file:GraphLvs2.png|thumb|right|300px|Информационный граф вычисления произведения матрицы на вектор.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=14709</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=14709"/>
		<updated>2016-10-29T14:03:00Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
# Алгоритм Арнольди&lt;br /&gt;
# Решение линейной задачи минимальных квадратов&lt;br /&gt;
# Вычисление решения&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[file:GraphLvs1.png|thumb|left|300px|Общая схема вычисления алгоритма]]&lt;br /&gt;
[[file:GraphLvs2.png|thumb|right|300px|Информационный граф вычисления произведения матрицы на вектор.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=10552</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=10552"/>
		<updated>2016-10-15T16:37:48Z</updated>

		<summary type="html">&lt;p&gt;Lvs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
# Алгоритм Арнольди&lt;br /&gt;
# Решение линейной задачи минимальных квадратов&lt;br /&gt;
# Вычисление решения&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:GraphLvs1.png]]&lt;br /&gt;
[[Файл:GraphLvs2.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=10495</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=10495"/>
		<updated>2016-10-15T16:23:33Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
# Алгоритм Арнольди&lt;br /&gt;
# Решение линейной задачи минимальных квадратов&lt;br /&gt;
# Вычисление решения&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
[[Файл:GraphLvs1.png]]&lt;br /&gt;
[[Файл:GraphLvs2.png]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=10426</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=10426"/>
		<updated>2016-10-15T16:06:05Z</updated>

		<summary type="html">&lt;p&gt;Lvs: /* ЧАСТЬ. Свойства и структура алгоритмов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
# Алгоритм Арнольди&lt;br /&gt;
# Решение линейной задачи минимальных квадратов&lt;br /&gt;
# Вычисление решения&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;br /&gt;
&lt;br /&gt;
= ЧАСТЬ. Программная реализация алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Реализации алгоритма GMRES присутствуют во многих программных продуктах как части стандартных библиотек, например Matlab или DEFORM3D. Также существую отдельные библиотеки, например MGMRES для языка С++.&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=10385</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=10385"/>
		<updated>2016-10-15T15:57:45Z</updated>

		<summary type="html">&lt;p&gt;Lvs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ЧАСТЬ. Свойства и структура алгоритмов =&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
Итерационный метод решения системы линейных алгебраических уравнений GMRES (или обобщенный метод минимальных невязок) используется для решения систем линейных алгебраических уравнений с заданной точностью приближения. Метод основан на процессе Арнольди, посредст­вом которого матрица СЛАУ приводится к (верхней) хессенберговой форме.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&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 \times n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Вычисляется последовательность приближённых решений уравнения &amp;lt;math&amp;gt; x_m &amp;lt;/math&amp;gt;, которая сходится к точному решению уравнения &amp;lt;math&amp;gt;x^*&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Подпространство Крылова размерности &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;, порожденное вектором &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; и матрицей &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; – линейное пространство&lt;br /&gt;
&amp;lt;math&amp;gt;K_m(A, v)&amp;lt;/math&amp;gt;, являющееся линейной оболочкой векторов &amp;lt;math&amp;gt;b, Ab, A^2b, ..., A^{m-1}b&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приближённое решение считается по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_m&amp;lt;/math&amp;gt; - матрица размера &amp;lt;math&amp;gt;n \times m&amp;lt;/math&amp;gt;, составленная из векторов ортонормированного базиса пространства &amp;lt;math&amp;gt;K_m(A, v)&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;||r||_2 = ||b - Ax_m||_2&amp;lt;/math&amp;gt;) с заданной точностью.&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Алгоритм Арнольди:&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
q[1] = b/||b||&lt;br /&gt;
for j = 1, ..., n-1 do&lt;br /&gt;
    z = Aq[j]; //очередной вектор&lt;br /&gt;
    for i = 1,..., j do&lt;br /&gt;
        h[i][j] = (z, q[i]);&lt;br /&gt;
        z = z − h[i][j]q[i];&lt;br /&gt;
    end i&lt;br /&gt;
    h[j+1][j] = ||z||;&lt;br /&gt;
    if (h[j+1][j] == 0) break;&lt;br /&gt;
    q[j+1] = z/h[j+1][j];&lt;br /&gt;
end j&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Сложность алгоритма &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма получаются векторы &amp;lt;math&amp;gt;q_1, q_2, ..., q_m&amp;lt;/math&amp;gt;, являющиеся ортонормированным базисом Крыловского пространства &amp;lt;math&amp;gt;K_m(A, b)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значения &amp;lt;math&amp;gt;h_{i,j}&amp;lt;/math&amp;gt; образуют верхнюю матрицу Хессенберга (обозначим как &amp;lt;math&amp;gt;H_m&amp;lt;/math&amp;gt;, размерность &amp;lt;math&amp;gt;m+1 \times m&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;H_k = \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;
Вектор невязки задан уравнением &amp;lt;math&amp;gt;r_m = H_my_m - ||b - Ax_0||e_1&amp;lt;/math&amp;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;
&lt;br /&gt;
Приближённое решение вычисляется по формуле &amp;lt;math&amp;gt; x_m = Q_my_m&amp;lt;/math&amp;gt; после нахождения соответствующего значения минимизирующего вторую невязку вектора. Сложность вычислений &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
# Алгоритм Арнольди&lt;br /&gt;
# Решение линейной задачи минимальных квадратов&lt;br /&gt;
# Вычисление решения&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
    Вычислить ортонормированный базис размера m&lt;br /&gt;
    Вычислить минимальное приближение&lt;br /&gt;
    if (приближение &amp;lt; заданная точность)&lt;br /&gt;
        Вычислить результат&lt;br /&gt;
        return;&lt;br /&gt;
    else&lt;br /&gt;
        Повторить для m = m+1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Сложность вычислений собственных векторов на каждом шаге - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;, но может уменьшиться до &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; при более разреженной матрице.&lt;br /&gt;
&lt;br /&gt;
Сложность решения задачи минимальных квадратов &amp;lt;math&amp;gt;O(m^2)&amp;lt;/math&amp;gt;, но при последовательном выполнении алгоритма можно понизить сложность до &amp;lt;math&amp;gt;O(m)&amp;lt;/math&amp;gt; путём использования подсчитанных на прошлых итерациях значений.&lt;br /&gt;
&lt;br /&gt;
Сложность вычисления решения &amp;lt;math&amp;gt;O(nm)&amp;lt;/math&amp;gt;, поэтому его целесообразно вычислять только в конце.&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
# Параллельное умножение матрицы на вектор выполняется в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
# Шаги алгоритма Арнольди выполняются строго последовательно, однако последующее нахождение невязки можно выполнять параллельно с запуском следующего шага алгоритма.&lt;br /&gt;
# Сложность решения задачи минимальных квадратов зависит от используемого алгоритма. В отличие от последовательного метода данные, полученные на прошлых шагах здесь использовать нельзя.&lt;br /&gt;
# Вычисление результата выполняется один раз, его можно выполнить параллельно в &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; ярусов умножений и сложений.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&#039;&#039;&#039;Входные данные:&#039;&#039;&#039; Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, вектор &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;, точность &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;. Объём: &amp;lt;math&amp;gt;n^2 + n + 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные:&#039;&#039;&#039; Вектор &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;
== Свойства алгоритма ==&lt;br /&gt;
Теоретически на каждой итерации алгоритма сложность вычислений составляет &amp;lt;math&amp;gt;n + X&amp;lt;/math&amp;gt; операций умножения, где &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; - сложность алгоритма для решения задачи минимальных квадратов. Таким образом в худшем случае сложность будет примерно равна &amp;lt;math&amp;gt;n^2 + X*n + n&amp;lt;/math&amp;gt; операций умножения.&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что в теории итерации алгоритма можно выполнять параллельно после выполнения алгоритма Арнольди, на практике необходимая точность может быть достигнута раньше чем на n-й итерации, что потребует какого-нибудь способа прервать последующие итерации. Для избегания лишних вычисление возможно оптимально оставить эту часть последовательной.&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=9450</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=9450"/>
		<updated>2016-10-15T12:25:36Z</updated>

		<summary type="html">&lt;p&gt;Lvs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ТЕСТ =&lt;br /&gt;
&lt;br /&gt;
== Ещё тест ==&lt;br /&gt;
&lt;br /&gt;
Ещё более тест&lt;/div&gt;</summary>
		<author><name>Lvs</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=9446</id>
		<title>Участник:Lvs/Итерационный метод решения системы линейных алгебраических уравнений GMRES</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:Lvs/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D1%8B%D1%85_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D0%B0%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%83%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9_GMRES&amp;diff=9446"/>
		<updated>2016-10-15T12:23:37Z</updated>

		<summary type="html">&lt;p&gt;Lvs: тест&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Тест&lt;/div&gt;</summary>
		<author><name>Lvs</name></author>
	</entry>
</feed>