<?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=Kpetrov</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=Kpetrov"/>
	<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/Kpetrov"/>
	<updated>2026-10-23T01:36:13Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Alexander34396&amp;diff=21331</id>
		<title>Обсуждение участника:Alexander34396</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Alexander34396&amp;diff=21331"/>
		<updated>2016-12-19T09:02:03Z</updated>

		<summary type="html">&lt;p&gt;Kpetrov: /* Пункт 2.4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK) К вашей работе есть несколько замечаний по содержанию и вопросы по пункту с масштабируемостью. Новая серия замечаний стоит с моей подписью.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.2.3 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Как здесь предлагается оценивать достижение требуемой точности?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.4 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Умножение вектора на скаляр;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Деление вектора на скаляр.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В чем с вычислительной точки зрения принципиальная разница между умножением и делением вектора на скаляр? Деление всегда можно записать в виде умножение на обратную величину.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.5 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;На практике используется перезапускаемая версия метода - GMRES(m):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Более распространенное название – версия GMRES с рестартами. Хорошо бы в этом разделе пояснить, почему «на практике используется» именно такая версия.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.6 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Нужно пояснить почему сложностью расчета &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;  можно пренебречь.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.8 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;...нахождение взвешенной суммы векторов.&#039;&#039;&#039; Линейная комбинация векторов?&lt;br /&gt;
&lt;br /&gt;
* Взвешенная сумма векторов - это линейная комбинация векторов&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Этот абзац не понятен и его нужно переформулировать. Например, применение параллельных вычислений не обязательно приводит к эффективности использованию вычислительных ресурсов.&lt;br /&gt;
&lt;br /&gt;
* этот абзац поправил&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Почему данный подход является «наиболее рациональным»? Например, n (размер вектора) может быть очень большим и вектор не будет помещаться в память одного процессора.&lt;br /&gt;
&lt;br /&gt;
* этот подход здесь рассматрвиается как один из возможных - и в зависимости от размера входных данных и от вычислительной машины и процессора можно применять разные методы распределения входных данных&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Требуются ли сборки данных в таком подходе на каждой итерации метода?&lt;br /&gt;
&lt;br /&gt;
* Сбор данных потребуется на каждой итерации метода&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.10 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Будет просто сходиться с некоторой точностью, или в точной арифметике – это прямой метод за n шагов?&lt;br /&gt;
&lt;br /&gt;
* Хотя GMRES используется как итерационный метод - теоретически он является прямым: реализуемый в точной арифметике, он приводит к точному решению системы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не более, чем в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Т.е. за n-1 шагов ошибка может быть сколь угодно большой? Нужно привести пример, ссылку или пояснить – в каком случае метод не сходится менее чем за n шагов?&lt;br /&gt;
&lt;br /&gt;
* ошибка в таком случае будет больше, чем приемлемая и сходимости, соответственно, не будет; примеров на данный случай к сожалению не смог найти&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Опечатка - &#039;&#039;&#039;включает в себя чрезмерную работы&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* опечатку поправил&lt;br /&gt;
&lt;br /&gt;
== Пункт 2.4 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Запускалась ли данная реализация GMRES в PETSc самостоятельно на указанном кластере?&lt;br /&gt;
&lt;br /&gt;
C чем связано то, что авторы работы [3] из списка литературы получили практически точно такой же график масштабируемости, но для предобусловленного метода GMRES, с помощью той же библиотеки PETSc и на том же самом кластере?&lt;br /&gt;
&lt;br /&gt;
Соответствует ли разбиение входных данных по параллельным процессам в реализации PETSc тому, что приведено в пункте 1.8? Описание алгоритма и то, что тестируется должно быть согласовано. Входит ли в замер времени счета описанная в пункте 1.8 сборка вектора решения на управляющем процессоре?&lt;br /&gt;
&lt;br /&gt;
Нужно также указать размерность задачи, описать структуру матрицы в экспериментах, условие на окончание итерационного процесса. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* самостоятельно данная реализация не запускалась. в других статьях по этой теме есть результаты запуска реализации, взятой с GitHub, с использованием библиотеки MPI. так как из всех статей по одной теме далее будет собираться одна большая, содержащая результаты всех статей, то я решил поискать работы по данному методу, в том числе иностранных научных исследователей, где использовались другие библиотеки, в частности PETSc. код, используемый при запуске, так же можно найти на GitHub, как и реализации метода при помощи других библиотек (в статьях других студентов). в указанных в списке используемой литературы статьях (для данной темы нашлись статьи, в которых использовались предобуславливатели, и поэтому здесь указан график для преобусловленного метода) описаны также задачи, на которых можно применять данный метод и структуры матриц, которые соответствуют системам уравнений. точность метода, то есть допустимая ошибка, равна 1E-6. Про время явно в этих статьях не указано, но в других работах (не совсем подходящих для данной статьи), видел указание, что время замерялось полное, то есть с учетом затрат временных ресурсов на сборку векторов, кроме того в библиотеке PETSc можно обращаться к часам явно через команды PetscLogDouble time; и PetscGetTime(&amp;amp;time);CHKERRQ(ierr). насчет размера системы - в статье указано, что решается линейная система, полученная из дискритезации уравнения Гельмгольца (то есть берется трехмерная сетка с определенным шагом и в каждой точке сетки фиксируют значения) - берется суперклетка размером 3х3х3 и периодически повторяется вдоль одной из осей с факторами 1, 2, 3, 8, 16; в суперклетках равномерно от идеальных позиций распределены атомы, для которых как раз решается система уравнений (7a)-(7b), указанная в статье. размер системы здесь - это получается количество атомов в этих суперклетках.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Добрый день. Начал проверять статью и оставил следующие заметки&lt;br /&gt;
&lt;br /&gt;
Здравствуйте. Немного исправил статью, исходя из ваших замечаний.&lt;br /&gt;
&lt;br /&gt;
= 1.2 = &lt;br /&gt;
На мой взгляд, нужны определения&lt;br /&gt;
span?&lt;br /&gt;
l2-норма?&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]] Дано пояснение обозначения span.Вместо l2-норма теперь используется Евклидова норма.&lt;br /&gt;
&lt;br /&gt;
= 1.2.1 = &lt;br /&gt;
Вот я читаю этот раздел как человек со стороны и вижу много формул. Почему они именно такие? В чем суть этого алгоритма?&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]] Перед алгоритмом добавлено описание идеи алгоритма и пояснения к формулам.&lt;br /&gt;
&lt;br /&gt;
= 1.2.2 = &lt;br /&gt;
Новые определения&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]] Добавлены некоторые пояснения.Добавлена ссылка на статью - вращения Гивенса.&lt;br /&gt;
&lt;br /&gt;
Затем я остановился, и у меня главные вопрос. Возможно ли сделать статью такой, чтобы для ее прочтения не требовалось обращаться к куче дополнительных источников? Вот я человек со стороны, хотя и заканчивал мехмат. Я могу разобраться со всем написанным здесь, но для этого мне придется гуглить кучу материалов. Но, насколько я понимаю, цель таких статей - быть более полными.&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]]  На мой взгляд, формат статей algo-wiki не подразумевает подробных объяснений и выводов формул, поэтому я добавил только некоторые пояснения, которые делают повествование более последовательным и несколько более понятным. При этом для полного понимания описанного метода для человека со стороны всё равно придётся обращаться к сторонним источникам.&lt;br /&gt;
&lt;br /&gt;
Можете или добавить объяснений или возразить мне. В любом случае, пока с прочтением остановился, жду ответа или исправление (а лучше и того, и другого)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= 2.4 = &lt;br /&gt;
[[Участник:Dan|Dan]] ([[Обсуждение участника:Dan|обсуждение]]) 19:09, 30 ноября 2016 (MSK) &#039;&#039;&#039;принято&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Kpetrov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Alexander34396&amp;diff=21330</id>
		<title>Обсуждение участника:Alexander34396</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Alexander34396&amp;diff=21330"/>
		<updated>2016-12-19T09:01:30Z</updated>

		<summary type="html">&lt;p&gt;Kpetrov: /* Пункт 2.4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK) К вашей работе есть несколько замечаний по содержанию и вопросы по пункту с масштабируемостью. Новая серия замечаний стоит с моей подписью.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.2.3 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Как здесь предлагается оценивать достижение требуемой точности?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.4 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Умножение вектора на скаляр;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Деление вектора на скаляр.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В чем с вычислительной точки зрения принципиальная разница между умножением и делением вектора на скаляр? Деление всегда можно записать в виде умножение на обратную величину.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.5 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;На практике используется перезапускаемая версия метода - GMRES(m):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Более распространенное название – версия GMRES с рестартами. Хорошо бы в этом разделе пояснить, почему «на практике используется» именно такая версия.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.6 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Нужно пояснить почему сложностью расчета &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;  можно пренебречь.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.8 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;...нахождение взвешенной суммы векторов.&#039;&#039;&#039; Линейная комбинация векторов?&lt;br /&gt;
&lt;br /&gt;
* Взвешенная сумма векторов - это линейная комбинация векторов&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Этот абзац не понятен и его нужно переформулировать. Например, применение параллельных вычислений не обязательно приводит к эффективности использованию вычислительных ресурсов.&lt;br /&gt;
&lt;br /&gt;
* этот абзац поправил&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Почему данный подход является «наиболее рациональным»? Например, n (размер вектора) может быть очень большим и вектор не будет помещаться в память одного процессора.&lt;br /&gt;
&lt;br /&gt;
* этот подход здесь рассматрвиается как один из возможных - и в зависимости от размера входных данных и от вычислительной машины и процессора можно применять разные методы распределения входных данных&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Требуются ли сборки данных в таком подходе на каждой итерации метода?&lt;br /&gt;
&lt;br /&gt;
* Сбор данных потребуется на каждой итерации метода&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.10 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Будет просто сходиться с некоторой точностью, или в точной арифметике – это прямой метод за n шагов?&lt;br /&gt;
&lt;br /&gt;
* Хотя GMRES используется как итерационный метод - теоретически он является прямым: реализуемый в точной арифметике, он приводит к точному решению системы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не более, чем в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Т.е. за n-1 шагов ошибка может быть сколь угодно большой? Нужно привести пример, ссылку или пояснить – в каком случае метод не сходится менее чем за n шагов?&lt;br /&gt;
&lt;br /&gt;
* ошибка в таком случае будет больше, чем приемлемая и сходимости, соответственно, не будет; примеров на данный случай к сожалению не смог найти&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Опечатка - &#039;&#039;&#039;включает в себя чрезмерную работы&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* опечатку поправил&lt;br /&gt;
&lt;br /&gt;
== Пункт 2.4 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Запускалась ли данная реализация GMRES в PETSc самостоятельно на указанном кластере?&lt;br /&gt;
&lt;br /&gt;
C чем связано то, что авторы работы [3] из списка литературы получили практически точно такой же график масштабируемости, но для предобусловленного метода GMRES, с помощью той же библиотеки PETSc и на том же самом кластере?&lt;br /&gt;
&lt;br /&gt;
Соответствует ли разбиение входных данных по параллельным процессам в реализации PETSc тому, что приведено в пункте 1.8? Описание алгоритма и то, что тестируется должно быть согласовано. Входит ли в замер времени счета описанная в пункте 1.8 сборка вектора решения на управляющем процессоре?&lt;br /&gt;
&lt;br /&gt;
Нужно также указать размерность задачи, описать структуру матрицы в экспериментах, условие на окончание итерационного процесса. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* самостоятельно данная реализация не запускалась. в других статьях по этой теме есть результаты запуска реализации, взятой с GitHub, с использованием библиотеки MPI. так как из всех статей по одной теме далее будет собираться одна большая, содержащая результаты всех статей, то я решил поискать работы по данному методу, в том числе иностранных научных исследователей, где использовались другие библиотеки, в частности PETSc. код, используемый при запуске, так же можно найти на GitHub, как и реализации метода при помощи других библиотек (в статьях других студентов). в указанных в списке используемой литературы статьях (для данной темы нашлись статьи, в которых использовались предобуславливатели, и поэтому здесь указан график для преобусловленного метода) описаны также задачи, на которых можно применять данный метод и структуры матриц, которые соответствуют системам уравнений. точность метода, то есть допустимая ошибка, равна 1E-6. Про время явно в этих статьях не указано, но в других работах (не совсем подходящих для данной статьи), видел указание, что время замерялось полное, то есть с учетом затрат временных ресурсов на сборку векторов, кроме того в библиотеке PETSc можно обращаться к часам явно через команды PetscLogDouble time; и PetscGetTime(&amp;amp;time);CHKERRQ(ierr).&lt;br /&gt;
насчет размера системы - в статье указано, что решается линейная система, полученная из дискритезации уравнения Гельмгольца (то есть берется трехмерная сетка с определенным шагом и в каждой точке сетки фиксируют значения) - берется суперклетка размером 3х3х3 и периодически повторяется вдоль одной из осей с факторами 1, 2, 3, 8, 16; в суперклетках равномерно от идеальных позиций распределены атомы, для которых как раз решается система уравнений (7a)-(7b), указанная в статье. размер системы здесь - это получается количество атомов в этих суперклетках.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Добрый день. Начал проверять статью и оставил следующие заметки&lt;br /&gt;
&lt;br /&gt;
Здравствуйте. Немного исправил статью, исходя из ваших замечаний.&lt;br /&gt;
&lt;br /&gt;
= 1.2 = &lt;br /&gt;
На мой взгляд, нужны определения&lt;br /&gt;
span?&lt;br /&gt;
l2-норма?&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]] Дано пояснение обозначения span.Вместо l2-норма теперь используется Евклидова норма.&lt;br /&gt;
&lt;br /&gt;
= 1.2.1 = &lt;br /&gt;
Вот я читаю этот раздел как человек со стороны и вижу много формул. Почему они именно такие? В чем суть этого алгоритма?&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]] Перед алгоритмом добавлено описание идеи алгоритма и пояснения к формулам.&lt;br /&gt;
&lt;br /&gt;
= 1.2.2 = &lt;br /&gt;
Новые определения&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]] Добавлены некоторые пояснения.Добавлена ссылка на статью - вращения Гивенса.&lt;br /&gt;
&lt;br /&gt;
Затем я остановился, и у меня главные вопрос. Возможно ли сделать статью такой, чтобы для ее прочтения не требовалось обращаться к куче дополнительных источников? Вот я человек со стороны, хотя и заканчивал мехмат. Я могу разобраться со всем написанным здесь, но для этого мне придется гуглить кучу материалов. Но, насколько я понимаю, цель таких статей - быть более полными.&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]]  На мой взгляд, формат статей algo-wiki не подразумевает подробных объяснений и выводов формул, поэтому я добавил только некоторые пояснения, которые делают повествование более последовательным и несколько более понятным. При этом для полного понимания описанного метода для человека со стороны всё равно придётся обращаться к сторонним источникам.&lt;br /&gt;
&lt;br /&gt;
Можете или добавить объяснений или возразить мне. В любом случае, пока с прочтением остановился, жду ответа или исправление (а лучше и того, и другого)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= 2.4 = &lt;br /&gt;
[[Участник:Dan|Dan]] ([[Обсуждение участника:Dan|обсуждение]]) 19:09, 30 ноября 2016 (MSK) &#039;&#039;&#039;принято&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Kpetrov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Alexander34396&amp;diff=21329</id>
		<title>Обсуждение участника:Alexander34396</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Alexander34396&amp;diff=21329"/>
		<updated>2016-12-19T08:09:48Z</updated>

		<summary type="html">&lt;p&gt;Kpetrov: /* Пункт 1.10 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK) К вашей работе есть несколько замечаний по содержанию и вопросы по пункту с масштабируемостью. Новая серия замечаний стоит с моей подписью.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.2.3 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Как здесь предлагается оценивать достижение требуемой точности?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.4 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Умножение вектора на скаляр;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Деление вектора на скаляр.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В чем с вычислительной точки зрения принципиальная разница между умножением и делением вектора на скаляр? Деление всегда можно записать в виде умножение на обратную величину.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.5 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;На практике используется перезапускаемая версия метода - GMRES(m):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Более распространенное название – версия GMRES с рестартами. Хорошо бы в этом разделе пояснить, почему «на практике используется» именно такая версия.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.6 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Нужно пояснить почему сложностью расчета &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;  можно пренебречь.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.8 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;...нахождение взвешенной суммы векторов.&#039;&#039;&#039; Линейная комбинация векторов?&lt;br /&gt;
&lt;br /&gt;
* Взвешенная сумма векторов - это линейная комбинация векторов&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Этот абзац не понятен и его нужно переформулировать. Например, применение параллельных вычислений не обязательно приводит к эффективности использованию вычислительных ресурсов.&lt;br /&gt;
&lt;br /&gt;
* этот абзац поправил&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Почему данный подход является «наиболее рациональным»? Например, n (размер вектора) может быть очень большим и вектор не будет помещаться в память одного процессора.&lt;br /&gt;
&lt;br /&gt;
* этот подход здесь рассматрвиается как один из возможных - и в зависимости от размера входных данных и от вычислительной машины и процессора можно применять разные методы распределения входных данных&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Требуются ли сборки данных в таком подходе на каждой итерации метода?&lt;br /&gt;
&lt;br /&gt;
* Сбор данных потребуется на каждой итерации метода&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.10 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Будет просто сходиться с некоторой точностью, или в точной арифметике – это прямой метод за n шагов?&lt;br /&gt;
&lt;br /&gt;
* Хотя GMRES используется как итерационный метод - теоретически он является прямым: реализуемый в точной арифметике, он приводит к точному решению системы порядка &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не более, чем в &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; шагов&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Т.е. за n-1 шагов ошибка может быть сколь угодно большой? Нужно привести пример, ссылку или пояснить – в каком случае метод не сходится менее чем за n шагов?&lt;br /&gt;
&lt;br /&gt;
* ошибка в таком случае будет больше, чем приемлемая и сходимости, соответственно, не будет; примеров на данный случай к сожалению не смог найти&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Опечатка - &#039;&#039;&#039;включает в себя чрезмерную работы&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* опечатку поправил&lt;br /&gt;
&lt;br /&gt;
== Пункт 2.4 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Запускалась ли данная реализация GMRES в PETSc самостоятельно на указанном кластере?&lt;br /&gt;
&lt;br /&gt;
C чем связано то, что авторы работы [3] из списка литературы получили практически точно такой же график масштабируемости, но для предобусловленного метода GMRES, с помощью той же библиотеки PETSc и на том же самом кластере?&lt;br /&gt;
&lt;br /&gt;
Соответствует ли разбиение входных данных по параллельным процессам в реализации PETSc тому, что приведено в пункте 1.8? Описание алгоритма и то, что тестируется должно быть согласовано. Входит ли в замер времени счета описанная в пункте 1.8 сборка вектора решения на управляющем процессоре?&lt;br /&gt;
&lt;br /&gt;
Нужно также указать размерность задачи, описать структуру матрицы в экспериментах, условие на окончание итерационного процесса. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Добрый день. Начал проверять статью и оставил следующие заметки&lt;br /&gt;
&lt;br /&gt;
Здравствуйте. Немного исправил статью, исходя из ваших замечаний.&lt;br /&gt;
&lt;br /&gt;
= 1.2 = &lt;br /&gt;
На мой взгляд, нужны определения&lt;br /&gt;
span?&lt;br /&gt;
l2-норма?&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]] Дано пояснение обозначения span.Вместо l2-норма теперь используется Евклидова норма.&lt;br /&gt;
&lt;br /&gt;
= 1.2.1 = &lt;br /&gt;
Вот я читаю этот раздел как человек со стороны и вижу много формул. Почему они именно такие? В чем суть этого алгоритма?&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]] Перед алгоритмом добавлено описание идеи алгоритма и пояснения к формулам.&lt;br /&gt;
&lt;br /&gt;
= 1.2.2 = &lt;br /&gt;
Новые определения&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]] Добавлены некоторые пояснения.Добавлена ссылка на статью - вращения Гивенса.&lt;br /&gt;
&lt;br /&gt;
Затем я остановился, и у меня главные вопрос. Возможно ли сделать статью такой, чтобы для ее прочтения не требовалось обращаться к куче дополнительных источников? Вот я человек со стороны, хотя и заканчивал мехмат. Я могу разобраться со всем написанным здесь, но для этого мне придется гуглить кучу материалов. Но, насколько я понимаю, цель таких статей - быть более полными.&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]]  На мой взгляд, формат статей algo-wiki не подразумевает подробных объяснений и выводов формул, поэтому я добавил только некоторые пояснения, которые делают повествование более последовательным и несколько более понятным. При этом для полного понимания описанного метода для человека со стороны всё равно придётся обращаться к сторонним источникам.&lt;br /&gt;
&lt;br /&gt;
Можете или добавить объяснений или возразить мне. В любом случае, пока с прочтением остановился, жду ответа или исправление (а лучше и того, и другого)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= 2.4 = &lt;br /&gt;
[[Участник:Dan|Dan]] ([[Обсуждение участника:Dan|обсуждение]]) 19:09, 30 ноября 2016 (MSK) &#039;&#039;&#039;принято&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Kpetrov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=21328</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=21328"/>
		<updated>2016-12-19T08:09:32Z</updated>

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

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

		<summary type="html">&lt;p&gt;Kpetrov: /* Пункт 1.8 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK) К вашей работе есть несколько замечаний по содержанию и вопросы по пункту с масштабируемостью. Новая серия замечаний стоит с моей подписью.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.2.3 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;вычислить &amp;lt;math&amp;gt; r_m &amp;lt;/math&amp;gt; и остановиться,если требуемая точность была достигнута, иначе повторить.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Как здесь предлагается оценивать достижение требуемой точности?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.4 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Умножение вектора на скаляр;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Деление вектора на скаляр.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
В чем с вычислительной точки зрения принципиальная разница между умножением и делением вектора на скаляр? Деление всегда можно записать в виде умножение на обратную величину.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.5 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;На практике используется перезапускаемая версия метода - GMRES(m):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Более распространенное название – версия GMRES с рестартами. Хорошо бы в этом разделе пояснить, почему «на практике используется» именно такая версия.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.6 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Если пренебречь сложностью вычисления &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;, то общую сложность алгоритма GMRES можно разделить на две части:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Нужно пояснить почему сложностью расчета &amp;lt;math&amp;gt; y_m &amp;lt;/math&amp;gt;  можно пренебречь.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.8 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;...нахождение взвешенной суммы векторов.&#039;&#039;&#039; Линейная комбинация векторов?&lt;br /&gt;
&lt;br /&gt;
* Взвешенная сумма векторов - это линейная комбинация векторов&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Поэтому при увеличении эффективности использования вычислительных ресурсов и ресурсов памяти вычислительной машины при выполнении этих операций повышается эффективность метода в целом. Достигается это применением при выполнении перечисленных операций аппарата параллельных вычислений.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Этот абзац не понятен и его нужно переформулировать. Например, применение параллельных вычислений не обязательно приводит к эффективности использованию вычислительных ресурсов.&lt;br /&gt;
&lt;br /&gt;
* этот абзац поправил&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;При выполнении параллельного алгоритма решения систем линейных алгебраических уравнений необходимо распределить входные данные наиболее рациональным способом. Матрица коэффициентов разбивается на непрерывные горизонтальные полосы. Распределение вектора правой части и начального приближения выполнено по принципу дублирования, т.е. все элементы векторов скопированы на все процессоры.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Почему данный подход является «наиболее рациональным»? Например, n (размер вектора) может быть очень большим и вектор не будет помещаться в память одного процессора.&lt;br /&gt;
&lt;br /&gt;
* этот подход здесь рассматрвиается как один из возможных - и в зависимости от размера входных данных и от вычислительной машины и процессора можно применять разные методы распределения входных данных&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Результатом выполнения рассматриваемых операций является, вектор, части которого расположены на участвовавших в вычислениях процессорах. Для объединения результатов расчета и получения полного вектора на каждом процессоре вычислительной системы необходимо выполнить операцию сбора данных.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Требуются ли сборки данных в таком подходе на каждой итерации метода?&lt;br /&gt;
&lt;br /&gt;
* Сбор данных потребуется на каждой итерации метода&lt;br /&gt;
&lt;br /&gt;
== Пункт 1.10 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Если используется неперезапускаемый метод, GMRES будет сходиться за не более &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; шагов.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Будет просто сходиться с некоторой точностью, или в точной арифметике – это прямой метод за n шагов?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Существуют примеры, для которых метод застаивается и сходимость есть только на &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;-м шаге. Для таких систем, любой выбор &amp;lt;math&amp;gt; m &amp;lt;/math&amp;gt; меньше, чем &amp;lt;math&amp;gt; n &amp;lt;/math&amp;gt; - не сходится.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Т.е. за n-1 шагов ошибка может быть сколь угодно большой? Нужно привести пример, ссылку или пояснить – в каком случае метод не сходится менее чем за n шагов?&lt;br /&gt;
&lt;br /&gt;
Опечатка - &#039;&#039;&#039;включает в себя чрезмерную работы&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Пункт 2.4 ==&lt;br /&gt;
--[[Участник:Evgeny Mortikov|Evgeny Mortikov]] ([[Обсуждение участника:Evgeny Mortikov|обсуждение]]) 05:42, 2 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
Запускалась ли данная реализация GMRES в PETSc самостоятельно на указанном кластере?&lt;br /&gt;
&lt;br /&gt;
C чем связано то, что авторы работы [3] из списка литературы получили практически точно такой же график масштабируемости, но для предобусловленного метода GMRES, с помощью той же библиотеки PETSc и на том же самом кластере?&lt;br /&gt;
&lt;br /&gt;
Соответствует ли разбиение входных данных по параллельным процессам в реализации PETSc тому, что приведено в пункте 1.8? Описание алгоритма и то, что тестируется должно быть согласовано. Входит ли в замер времени счета описанная в пункте 1.8 сборка вектора решения на управляющем процессоре?&lt;br /&gt;
&lt;br /&gt;
Нужно также указать размерность задачи, описать структуру матрицы в экспериментах, условие на окончание итерационного процесса. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Добрый день. Начал проверять статью и оставил следующие заметки&lt;br /&gt;
&lt;br /&gt;
Здравствуйте. Немного исправил статью, исходя из ваших замечаний.&lt;br /&gt;
&lt;br /&gt;
= 1.2 = &lt;br /&gt;
На мой взгляд, нужны определения&lt;br /&gt;
span?&lt;br /&gt;
l2-норма?&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]] Дано пояснение обозначения span.Вместо l2-норма теперь используется Евклидова норма.&lt;br /&gt;
&lt;br /&gt;
= 1.2.1 = &lt;br /&gt;
Вот я читаю этот раздел как человек со стороны и вижу много формул. Почему они именно такие? В чем суть этого алгоритма?&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]] Перед алгоритмом добавлено описание идеи алгоритма и пояснения к формулам.&lt;br /&gt;
&lt;br /&gt;
= 1.2.2 = &lt;br /&gt;
Новые определения&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]] Добавлены некоторые пояснения.Добавлена ссылка на статью - вращения Гивенса.&lt;br /&gt;
&lt;br /&gt;
Затем я остановился, и у меня главные вопрос. Возможно ли сделать статью такой, чтобы для ее прочтения не требовалось обращаться к куче дополнительных источников? Вот я человек со стороны, хотя и заканчивал мехмат. Я могу разобраться со всем написанным здесь, но для этого мне придется гуглить кучу материалов. Но, насколько я понимаю, цель таких статей - быть более полными.&lt;br /&gt;
&lt;br /&gt;
: [[Участник:Alexander34396|Alexander34396]]  На мой взгляд, формат статей algo-wiki не подразумевает подробных объяснений и выводов формул, поэтому я добавил только некоторые пояснения, которые делают повествование более последовательным и несколько более понятным. При этом для полного понимания описанного метода для человека со стороны всё равно придётся обращаться к сторонним источникам.&lt;br /&gt;
&lt;br /&gt;
Можете или добавить объяснений или возразить мне. В любом случае, пока с прочтением остановился, жду ответа или исправление (а лучше и того, и другого)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= 2.4 = &lt;br /&gt;
[[Участник:Dan|Dan]] ([[Обсуждение участника:Dan|обсуждение]]) 19:09, 30 ноября 2016 (MSK) &#039;&#039;&#039;принято&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Kpetrov</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=19657</id>
		<title>Участник:Alexander34396/Обобщенный метод минимальных невязок</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Alexander34396/%D0%9E%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%BD%D0%B5%D0%B2%D1%8F%D0%B7%D0%BE%D0%BA&amp;diff=19657"/>
		<updated>2016-11-30T15:34:56Z</updated>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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