<?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=AlexShevelev</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=AlexShevelev"/>
	<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/AlexShevelev"/>
	<updated>2026-10-22T23:19:43Z</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:Odbaev&amp;diff=20841</id>
		<title>Обсуждение участника:Odbaev</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:Odbaev&amp;diff=20841"/>
		<updated>2016-12-13T15:49:40Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* По существу */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Статья [[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(2)]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу ===&lt;br /&gt;
&lt;br /&gt;
* В таком виде алгоритм не применяется из-за медленности. Где приведение к хессенбергу и сдвиги? Изменения затронут все разделы. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:48, 10 ноября 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
* Во вкладке ошибочная оценка сложности. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:20, 6 декабря 2016 (MSK)&lt;br /&gt;
** Исправлено&lt;br /&gt;
&lt;br /&gt;
=== Замечания ===&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=20840</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=20840"/>
		<updated>2016-12-13T15:48:12Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Приведение матрицы к форме Хессенберга */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3) + N * O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)+N*O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5 базовый, 1.9, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.2-1.5 хессенберг, 1.6 - 1.8, 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix | Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;gt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга за счет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеет вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице в форме Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H&#039;&#039; &amp;amp;larr; To_Hessenberg(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице в форме Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице в форме Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы в форме Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей в форме Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
В случае QR-алгоритма, в котором применяется приведение исходной матрицы к форме Хессенберга и сдвиги, представленные графы будут немного изменены: на Рисунке 1 перед первой итерацией появится элемент с приведением матрицы, а на Рисунке 2 добавятся элементы, отображающие сдвиги.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как и для базового алгоритма подсчитаем параллельную сложность для каждой операции, а в конце для всего алгоритма в целом:&lt;br /&gt;
* Приведением исходной матрицы к форме Хессенберга - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Отдельно каждая итерация  - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итоговая параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(n^2) + N*O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки [http://www.netlib.org/scalapack/ ScaLAPACK]. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере [http://hpc.cmc.msu.ru/regatta Regatta].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Файл:baev_qr_execution.png|thumb|center|700px|Рисунок 3. Время выполнения QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Эффективность распараллеливания &amp;lt;math&amp;gt;E = S/p&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S = T_1/T_p&amp;lt;/math&amp;gt; - полученное ускорение работы программы, а &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число используемых процессов.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Файл:baev_qr_efficiency.png|thumb|center|700px|Рисунок 4. Эффективность QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
Библиотека [http://www.netlib.org/scalapack/ ScaLAPACK 2.0.0] была установлена самостоятельно.&lt;br /&gt;
Использовался компилятор mpicxx с опциями -lscalapack -llapack и указанием пути до установленной библиотеки.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=20193</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=20193"/>
		<updated>2016-12-06T17:41:54Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3) + N * O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;O(n^2)+N*O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5 базовый, 1.9, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.2-1.5 хессенберг, 1.6 - 1.8, 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix | Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;gt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга за счет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеет вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице в форме Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H&#039;&#039; &amp;amp;larr; To_Hessenberg(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице в форме Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице в форме Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы в форме Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей в форме Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
В случае QR-алгоритма, в котором применяется приведение исходной матрицы к форме Хессенберга и сдвиги, представленные графы будут немного изменены: на Рисунке 1 перед первой итерацией появится элемент с приведением матрицы, а на Рисунке 2 добавятся элементы, отображающие сдвиги.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как и для базового алгоритма подсчитаем параллельную сложность для каждой операции, а в конце для всего алгоритма в целом:&lt;br /&gt;
* Приведением исходной матрицы к форме Хессенберга - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Отдельно каждая итерация  - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итоговая параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(n^2) + N*O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки [http://www.netlib.org/scalapack/ ScaLAPACK]. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере [http://hpc.cmc.msu.ru/regatta Regatta].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Файл:baev_qr_execution.png|thumb|center|700px|Рисунок 3. Время выполнения QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Эффективность распараллеливания &amp;lt;math&amp;gt;E = S/p&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S = T_1/T_p&amp;lt;/math&amp;gt; - полученное ускорение работы программы, а &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число используемых процессов.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Файл:baev_qr_efficiency.png|thumb|center|700px|Рисунок 4. Эффективность QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
Библиотека [http://www.netlib.org/scalapack/ ScaLAPACK 2.0.0] была установлена самостоятельно.&lt;br /&gt;
Использовался компилятор mpicxx с опциями -lscalapack -llapack и указанием пути до установленной библиотеки.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=20192</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=20192"/>
		<updated>2016-12-06T17:40:27Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;O(n^3) + N * O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5 базовый, 1.9, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.2-1.5 хессенберг, 1.6 - 1.8, 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix | Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;gt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга за счет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеет вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице в форме Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H&#039;&#039; &amp;amp;larr; To_Hessenberg(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице в форме Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице в форме Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы в форме Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей в форме Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
В случае QR-алгоритма, в котором применяется приведение исходной матрицы к форме Хессенберга и сдвиги, представленные графы будут немного изменены: на Рисунке 1 перед первой итерацией появится элемент с приведением матрицы, а на Рисунке 2 добавятся элементы, отображающие сдвиги.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как и для базового алгоритма подсчитаем параллельную сложность для каждой операции, а в конце для всего алгоритма в целом:&lt;br /&gt;
* Приведением исходной матрицы к форме Хессенберга - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Отдельно каждая итерация  - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итоговая параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(n^2) + N*O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки [http://www.netlib.org/scalapack/ ScaLAPACK]. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере [http://hpc.cmc.msu.ru/regatta Regatta].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Файл:baev_qr_execution.png|thumb|center|700px|Рисунок 3. Время выполнения QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Эффективность распараллеливания &amp;lt;math&amp;gt;E = S/p&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;S = T_1/T_p&amp;lt;/math&amp;gt; - полученное ускорение работы программы, а &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; - число используемых процессов.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Файл:baev_qr_efficiency.png|thumb|center|700px|Рисунок 4. Эффективность QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
Библиотека [http://www.netlib.org/scalapack/ ScaLAPACK 2.0.0] была установлена самостоятельно.&lt;br /&gt;
Использовался компилятор mpicxx с опциями -lscalapack -llapack и указанием пути до установленной библиотеки.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=17004</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=17004"/>
		<updated>2016-11-14T12:45:40Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Приведение матрицы к форме Хессенберга */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5 базовый, 1.9, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.2-1.5 хессенберг, 1.6 - 1.8, 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix | Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице в форме Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H&#039;&#039; &amp;amp;larr; To_Hessenberg(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице в форме Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице в форме Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы в форме Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей в форме Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
В случае QR-алгоритма, в котором применяется приведение исходной матрицы к форме Хессенберга и сдвиги, представленные графы будут немного изменены: на Рисунке 1 перед первой итерацией появится элемент с приведением матрицы, а на Рисунке 2 добавятся элементы, отображающие сдвиги.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как и для базового алгоритма подсчитаем параллельную сложность для каждой операции, а в конце для всего алгоритма в целом:&lt;br /&gt;
* Приведением исходной матрицы к форме Хессенберга - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Отдельно каждая итерация  - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итоговая параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(n^2) + N*O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16990</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16990"/>
		<updated>2016-11-14T12:26:31Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5 базовый, 1.9, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.2-1.5 хессенберг, 1.6 - 1.8, 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице в форме Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H&#039;&#039; &amp;amp;larr; To_Hessenberg(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице в форме Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице в форме Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы в форме Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей в форме Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
В случае QR-алгоритма, в котором применяется приведение исходной матрицы к форме Хессенберга и сдвиги, представленные графы будут немного изменены: на Рисунке 1 перед первой итерацией появится элемент с приведением матрицы, а на Рисунке 2 добавятся элементы, отображающие сдвиги.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как и для базового алгоритма подсчитаем параллельную сложность для каждой операции, а в конце для всего алгоритма в целом:&lt;br /&gt;
* Приведением исходной матрицы к форме Хессенберга - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Отдельно каждая итерация  - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итоговая параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(n^2) + N*O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16989</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16989"/>
		<updated>2016-11-14T12:25:11Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5 базовый, 1.9, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице в форме Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H&#039;&#039; &amp;amp;larr; To_Hessenberg(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице в форме Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице в форме Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы в форме Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей в форме Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
В случае QR-алгоритма, в котором применяется приведение исходной матрицы к форме Хессенберга и сдвиги, представленные графы будут немного изменены: на Рисунке 1 перед первой итерацией появится элемент с приведением матрицы, а на Рисунке 2 добавятся элементы, отображающие сдвиги.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как и для базового алгоритма подсчитаем параллельную сложность для каждой операции, а в конце для всего алгоритма в целом:&lt;br /&gt;
* Приведением исходной матрицы к форме Хессенберга - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Отдельно каждая итерация  - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итоговая параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(n^2) + N*O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16988</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16988"/>
		<updated>2016-11-14T12:22:47Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице в форме Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H&#039;&#039; &amp;amp;larr; To_Hessenberg(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице в форме Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице в форме Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы в форме Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей в форме Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
В случае QR-алгоритма, в котором применяется приведение исходной матрицы к форме Хессенберга и сдвиги, представленные графы будут немного изменены: на Рисунке 1 перед первой итерацией появится элемент с приведением матрицы, а на Рисунке 2 добавятся элементы, отображающие сдвиги.&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как и для базового алгоритма подсчитаем параллельную сложность для каждой операции, а в конце для всего алгоритма в целом:&lt;br /&gt;
* Приведением исходной матрицы к форме Хессенберга - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Отдельно каждая итерация  - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итоговая параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(n^2) + N*O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16987</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16987"/>
		<updated>2016-11-14T12:18:55Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице в форме Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H&#039;&#039; &amp;amp;larr; To_Hessenberg(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице в форме Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице в форме Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы в форме Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей в форме Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как и для базового алгоритма подсчитаем параллельную сложность для каждой операции, а в конце для всего алгоритма в целом:&lt;br /&gt;
* Приведением исходной матрицы к форме Хессенберга - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Отдельно каждая итерация  - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итоговая параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(n^2) + N*O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16986</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16986"/>
		<updated>2016-11-14T12:18:27Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице в форме Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H&#039;&#039; &amp;amp;larr; To_Hessenberg(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице в форме Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице в форме Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы в форме Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей в форме Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Как и для базового алгоритма подсчитаем параллельную сложность для каждой операции, а в конце для всего алгоритма в целом:&lt;br /&gt;
* Приведением исходной матрицы к форме Хессенберга - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Отдельно каждая итерация  - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итоговая параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(n^2) + N*O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16985</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16985"/>
		<updated>2016-11-14T12:17:17Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице в форме Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H&#039;&#039; &amp;amp;larr; To_Hessenberg(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Как и для базового алгоритма подсчитаем параллельную сложность для каждой операции, а в конце для всего алгоритма в целом:&lt;br /&gt;
* Приведением исходной матрицы к форме Хессенберга - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Отдельно каждая итерация  - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итоговая параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(n^2) + N*O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16983</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16983"/>
		<updated>2016-11-14T12:16:49Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице в форме Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H&#039;&#039; &amp;amp;larr; To_Hessenberg(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Как и для базового алгоритма подсчитаем параллельную сложность для каждой операции, а в конце для всего алгоритма в целом:&lt;br /&gt;
* Приведением исходной матрицы к форме Хессенберга - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Отдельно каждая итерация  - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итоговая параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(n^2) + N*O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16982</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16982"/>
		<updated>2016-11-14T12:16:19Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к форме Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице в форме Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H&#039;&#039; &amp;amp;larr; To_Hessenberg(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Как и для базового алгоритма подсчитаем параллельную сложность для каждой операции, а в конце для всего алгоритма в целом:&lt;br /&gt;
* Приведением исходной матрицы к форме Хессенберга - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Отдельно каждая итерация  - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итоговая параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(n^2) + N*O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16980</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16980"/>
		<updated>2016-11-14T12:13:44Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H&#039;&#039; &amp;amp;larr; To_Hessenberg(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Как и для базового алгоритма подсчитаем параллельную сложность для каждой операции, а в конце для всего алгоритма в целом:&lt;br /&gt;
* Приведением исходной матрицы к форме Хессенберга - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Отдельно каждая итерация  - &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Итоговая параллельная сложность алгоритма - &amp;lt;math&amp;gt;O(n^2) + N*O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16976</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16976"/>
		<updated>2016-11-14T12:10:14Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H&#039;&#039; &amp;amp;larr; To_Hessenberg(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16971</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16971"/>
		<updated>2016-11-14T12:07:22Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H&#039;&#039; &amp;amp;larr; To_Hessenberg(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16970</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16970"/>
		<updated>2016-11-14T12:06:50Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;H &amp;amp;larr; To_Hessenberg(A)&#039;&#039;&lt;br /&gt;
   &#039;&#039;A &amp;amp;larr; H&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k&#039;&#039; &amp;amp;larr; Get_coeff(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16969</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16969"/>
		<updated>2016-11-14T12:05:45Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;&#039;H &amp;amp;larr; To_Hessenberg(A)&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;A &amp;amp;larr; H&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;v_k &amp;amp;larr; Get_coeff(A)&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A - v_k*E&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q + v_k*E&#039;&#039; &lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16968</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16968"/>
		<updated>2016-11-14T12:03:37Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &lt;br /&gt;
   &#039;&#039;&#039;H &amp;amp;larr; To_Hessenberg(A)&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;A &amp;amp;larr; H&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;&amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16966</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16966"/>
		<updated>2016-11-14T12:00:39Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Выполнение &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; итераций (&amp;lt;math&amp;gt;A_0 = H&amp;lt;/math&amp;gt;):&lt;br /&gt;
** Выбор коэффициента &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** QR-разложение &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
** &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16962</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16962"/>
		<updated>2016-11-14T11:56:30Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Как уже было описано ранее, данный алгоритм состоит из следуюших этапов:&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16961</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16961"/>
		<updated>2016-11-14T11:44:23Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16960</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16960"/>
		<updated>2016-11-14T11:40:50Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm | QR algorithm]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц потребует столько же операций, как и для базового алгоритма - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* Вычисление сдвигов не является затратной операцией по сравнению с другими.&lt;br /&gt;
&lt;br /&gt;
Таким образом, полная последовательная сложность QR-алгоритма с матрицей Хессенберга и сдвигами - &amp;lt;math&amp;gt;O(n^3) + N*(6n^2+O(n))&amp;lt;/math&amp;gt; или &amp;lt;math&amp;gt;O(n^3) + N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16955</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16955"/>
		<updated>2016-11-14T11:36:08Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице Хессенберга методом Хаусхолдера потребует &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
* QR-разложение методом Гивенса матрицы Хессенберга - &amp;lt;math&amp;gt;6n^2 + O(n)&amp;lt;/math&amp;gt; операций &amp;lt;ref&amp;gt;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16953</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16953"/>
		<updated>2016-11-14T11:33:27Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
* Приведение к матрице Хессенберга методом Хаусхолдера потребует&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16952</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16952"/>
		<updated>2016-11-14T11:30:01Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Базовый алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16951</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16951"/>
		<updated>2016-11-14T11:29:27Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложения методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножения матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16950</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16950"/>
		<updated>2016-11-14T11:28:55Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
# Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
# Итеративное выполнение QR-разложение методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16949</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16949"/>
		<updated>2016-11-14T11:28:30Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
* Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
* Итеративное выполнение QR-разложение методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Пусть как и для базового алгоритма дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. Как уже было описано выше, в данном варианте алгоритма выполняются три основные операции: приведение исходной матрицы к матрице Хессенберга, QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждой операции:&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16939</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16939"/>
		<updated>2016-11-14T11:00:53Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
* Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
* Итеративное выполнение QR-разложение методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
=== Базовый алгоритм ===&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16937</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16937"/>
		<updated>2016-11-14T10:59:37Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
* Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
* Итеративное выполнение QR-разложение методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16936</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16936"/>
		<updated>2016-11-14T10:58:07Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
* Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
* Итеративно выполнять QR-разложение методом Гивенса&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16933</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16933"/>
		<updated>2016-11-14T10:57:30Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
В данном варианте макроструктура алгоритма выглядит следующим образом:&lt;br /&gt;
* Приведение исходной матрицы к матрице Хессенберга.&lt;br /&gt;
* Итеративно выполнять QR-разложение методом Гивенса и перемножение матриц.&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16916</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16916"/>
		<updated>2016-11-14T10:46:52Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16914</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16914"/>
		<updated>2016-11-14T10:45:09Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц &amp;lt;math&amp;gt;R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16912</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16912"/>
		<updated>2016-11-14T10:44:27Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга. Данная операция производится методом Хаусхолдера.&lt;br /&gt;
* Выполнение QR-разложения матрицы &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt; модифицированным методом Гивенса.&lt;br /&gt;
* Перемножение двух плотных матриц R_kQ_k.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16906</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16906"/>
		<updated>2016-11-14T10:39:28Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм с приведением к матрице Хессенберга и сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
Основными вычислительными ядрами данного варианта алгоритма являются:&lt;br /&gt;
* Приведение исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к матрице Хессенберга.&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16898</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16898"/>
		<updated>2016-11-14T10:32:44Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм со сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому набор собственных чисел не изменяется.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16891</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16891"/>
		<updated>2016-11-14T10:30:21Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому они будут иметь одни и те же собственные числа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм с приведением к матрице Хессенберга и сдвигами ===&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16889</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16889"/>
		<updated>2016-11-14T10:27:09Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм со сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; подобны, поэтому они будут иметь одни и те же собственные числа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16887</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16887"/>
		<updated>2016-11-14T10:26:26Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм со сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги.&lt;br /&gt;
&lt;br /&gt;
Суть метода заключается в следующем:&lt;br /&gt;
Пусть на &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-й итерации есть матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;, тогда переход к матрице &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; происходит следующим образом:&lt;br /&gt;
* Выбирается число &amp;lt;math&amp;gt;v_k&amp;lt;/math&amp;gt; и выполняется QR-разложение: &amp;lt;math&amp;gt;A_k - v_kE = Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k + v_kE&amp;lt;/math&amp;gt;&lt;br /&gt;
При этом матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt;, поэтому они будут иметь одни и те же собственные числа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16876</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16876"/>
		<updated>2016-11-14T09:27:15Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* QR-алгоритм со сдвигами */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
Скорость сходимости QR-алгоритма зависит от того, насколько близки друг к другу собственные числа матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - чем ближе они друг к другу, тем медленнее алгоритм сходится. Поэтому для ускорения сходимости используют так называемые сдвиги, позволяющие &amp;quot;раздвинуть&amp;quot; собственные числа.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16875</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16875"/>
		<updated>2016-11-14T09:22:35Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
=== QR-алгоритм со сдвигами ===&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16874</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16874"/>
		<updated>2016-11-14T09:18:03Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Приведение матрицы к форме Хессенберга */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца при помощи операции скалярного произведения.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16873</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16873"/>
		<updated>2016-11-14T09:17:01Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Приведение матрицы к форме Хессенберга */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
При этом матрица отражений на каждом из шагов имеет не стандартный вид, описанный ранее, а &amp;lt;math&amp;gt;U=E-\frac{1}{\gamma}vv^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; находится для левых матриц отражения через координаты текущего &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16872</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16872"/>
		<updated>2016-11-14T09:14:31Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Приведение матрицы к форме Хессенберга */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
Цель домножения исходной матрицы на матрицу отражения на &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге заключается в обнулении поддиагональных элементов &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го столбца. Таким образом за &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; итерацию исходная матрица будет приведена к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16870</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16870"/>
		<updated>2016-11-14T09:07:18Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Приведение матрицы к форме Хессенберга */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Идея метода состоит в последовательном приведении исходной матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга засчет умножения на матрицы отражений, каждая из которых может быть определена одним вектором и имеют вид &amp;lt;math&amp;gt;U = E - 2ww^*&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; - вектор, удовлетворяющий равенству &amp;lt;math&amp;gt;w^*w = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16869</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16869"/>
		<updated>2016-11-14T08:56:36Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Приведение матрицы к форме Хессенберга */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16868</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16868"/>
		<updated>2016-11-14T08:53:56Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Приведение матрицы к форме Хессенберга */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Любая матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; может быть приведена к подобной матрице, имеющей форму Хессенберга. Подобная манипуляция позволяет значительно ускорить дальнейший процесс QR-разложения. Одним из способов приведения матрицы к форме Хессенберга является метод Хаусхолдера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Householder_transformation#Tridiagonalization%7C Wikipedia: Householder transformation]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16867</id>
		<title>Участник:Odbaev/Нахождение собственных чисел квадратной матрицы методом QR разложения (2)</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:Odbaev/%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BC_QR_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F_(2)&amp;diff=16867"/>
		<updated>2016-11-14T08:41:24Z</updated>

		<summary type="html">&lt;p&gt;AlexShevelev: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&lt;br /&gt;
&lt;br /&gt;
{{algorithm&lt;br /&gt;
| name              = Нахождение собственных чисел квадратной матрицы методом QR разложения&lt;br /&gt;
| serial_complexity = &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_height         = &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;&lt;br /&gt;
| pf_width          = &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| input_data        = &amp;lt;math&amp;gt;n^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;
Основные авторы описания: [[Участник:Odbaev|О.Д.Баев]] (пп. 1.1 - 1.5, 2.4, 2.7), [[Участник:AlexShevelev|А.С.Шевелев]] (пп. 1.6 - 1.10)&lt;br /&gt;
&lt;br /&gt;
= Свойства и структура алгоритма =&lt;br /&gt;
&lt;br /&gt;
== Общее описание алгоритма ==&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В.Н. Кублановской и Дж. Фрэнсисом.&lt;br /&gt;
&lt;br /&gt;
== Математическое описание алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Базовый QR-алгоритм ===&lt;br /&gt;
Пусть &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; — вещественная квадратная матрица, для которой мы хотим найти собственные числа и векторы. Положим &amp;lt;math&amp;gt;A_0 = A&amp;lt;/math&amp;gt;. На &#039;&#039;k&#039;&#039;-ом шаге (начиная с &#039;&#039;k&#039;&#039; = 0) вычислим QR-разложение &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt; — ортогональная матрица (то есть &amp;lt;math&amp;gt;Q_k^{T} = Q_k^{-1}&amp;lt;/math&amp;gt;), а &amp;lt;math&amp;gt;R_k&amp;lt;/math&amp;gt; — верхняя треугольная матрица. Затем мы определяем &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что&lt;br /&gt;
: &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k = Q_k^{-1} Q_k R_k Q_k = Q_k^{-1} A_k Q_k = Q_k^{T} A_k Q_k, &amp;lt;/math&amp;gt;&lt;br /&gt;
то есть все матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; являются подобными и их собственные значения равны.&lt;br /&gt;
&lt;br /&gt;
Пусть все диагональные миноры матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; не вырождены. Тогда последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;k \rightarrow \infty&amp;lt;/math&amp;gt; сходится по форме к клеточному правому треугольному виду, соответствующему клеткам с одинаковыми по модулю собственными значениями. &amp;lt;ref&amp;gt; Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численные методы&amp;quot; — 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с. &amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы получить собственные векторы матрицы, нужно перемножить все матрицы &amp;lt;math&amp;gt;Q_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Приведение матрицы к форме Хессенберга ===&lt;br /&gt;
Матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет форму Хессенберга&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hessenberg_matrix| Матрица Хессенберга]&amp;lt;/ref&amp;gt;, если все элементы &amp;lt;math&amp;gt;a_{ij}&amp;lt;/math&amp;gt; под первой поддиагональю равны нулю (&amp;lt;math&amp;gt;a_{ij} = 0, i &amp;lt; j + 1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Вычислительное ядро алгоритма ==&lt;br /&gt;
Основными вычислительными ядрами алгоритма являются:&lt;br /&gt;
* QR-разложение матрицы &amp;lt;math&amp;gt;A_k = Q_k R_k&amp;lt;/math&amp;gt;&lt;br /&gt;
* Умножение плотных матриц &amp;lt;math&amp;gt;A_{k+1} = R_k Q_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Существуют различные алгоритмы вычисления QR-разложения. Можно выделить такие, как метод Гивенса и метод Хаусхолдера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание вычислительных ядер содержится в соответствующих статьях, указанных в пункте 1.4 (Макроструктура алгоритма).&lt;br /&gt;
&lt;br /&gt;
== Макроструктура алгоритма ==&lt;br /&gt;
QR-алгоритм на каждой итерации использует следующие макрооперации:&lt;br /&gt;
# QR-разложение&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Умножение матриц]]&lt;br /&gt;
&lt;br /&gt;
== Схема реализации последовательного алгоритма ==&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм является итерационным.&lt;br /&gt;
&lt;br /&gt;
На каждой итерации &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k &amp;lt;/math&amp;gt;:&lt;br /&gt;
# Строится QR-разложение матрицы &amp;lt;math&amp;gt; A_k = Q_k R_k &amp;lt;/math&amp;gt;&lt;br /&gt;
# Получается матрица &amp;lt;math&amp;gt; A_{k+1} = R_k Q_k &amp;lt;/math&amp;gt;, используемая на следующей итерации&lt;br /&gt;
&lt;br /&gt;
Алгоритм выполняется до сходимости матрицы &amp;lt;math&amp;gt; A_k&amp;lt;/math&amp;gt; к треугольному виду.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Псевдокод алгоритма:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;algorithm&#039;&#039;&#039; QR &#039;&#039;&#039;is&#039;&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;input:&#039;&#039;&#039; Matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;output:&#039;&#039;&#039; Eigenvalues of the matrix &#039;&#039;A&#039;&#039;&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;repeat&#039;&#039;&#039;&lt;br /&gt;
     &#039;&#039;Q&#039;&#039;, &#039;&#039;R&#039;&#039; &amp;amp;larr; QR_factorization(&#039;&#039;A&#039;&#039;)&lt;br /&gt;
     &#039;&#039;A&#039;&#039; &amp;amp;larr; &#039;&#039;R&#039;&#039;&amp;amp;times;&#039;&#039;Q&#039;&#039;&lt;br /&gt;
   &#039;&#039;&#039;until&#039;&#039;&#039; convergence&lt;br /&gt;
     &lt;br /&gt;
   &#039;&#039;&#039;return&#039;&#039;&#039; diag(A)&lt;br /&gt;
&lt;br /&gt;
== Последовательная сложность алгоритма ==&lt;br /&gt;
Пусть дана матрица &amp;lt;math&amp;gt; A \in \mathbb{R}^{n \times n}&amp;lt;/math&amp;gt;. До момента приведения матрицы к треугольной форме произведено &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций алгоритма.&lt;br /&gt;
На каждой итерации алгоритма производится три действия: QR-разложение, перемножение матриц и проверка, является ли матрица треугольной.&lt;br /&gt;
&lt;br /&gt;
Распишем последовательную сложность каждого действия:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;2*n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt; операций&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;\frac{n^2 - n}{2}&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
Таким образом, на каждой итерации последовательный алгоритм выполняет &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; операций. Для всего алгоритма потребуется выполнить &amp;lt;math&amp;gt;N * O(n^3)&amp;lt;/math&amp;gt; операций.&lt;br /&gt;
&lt;br /&gt;
== Информационный граф ==&lt;br /&gt;
На Рисунке 1 изображен макрограф описываемого QR-алгоритма, представляющего собой последовательность итераций алгоритма. На рисунке 2 представлен граф, на котором более подробно отображено содержимое каждой итерации.&lt;br /&gt;
Информационные графы [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|QR-разложения]] и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)#.D0.98.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D0.BE.D0.BD.D0.BD.D1.8B.D0.B9_.D0.B3.D1.80.D0.B0.D1.84|матричного умножения]] представлены в соответствующих статьях.&lt;br /&gt;
[[Файл:macro_shev_graph.png|thumb|center|700px|Рисунок 1. Макрограф базового QR-алгоритма.]]&lt;br /&gt;
[[Файл:Screenshot - 15.10.2016 - 19-02-55.png|thumb|center|800px|Рисунок 2. Информационный граф i-й итерации QR-алгоритма.]]&lt;br /&gt;
&lt;br /&gt;
== Ресурс параллелизма алгоритма ==&lt;br /&gt;
Базовый алгоритм является итерационным и выполняется последовательно. &lt;br /&gt;
Возможность распараллеливания алгоритма предоставляется при реализации операций таких, как QR-разложение, перемножение матриц и проверка, имеет ли матрица треугольную форму.&lt;br /&gt;
&lt;br /&gt;
Рассчитаем параллельную сложность для каждой из указанных операций:&lt;br /&gt;
* QR-разложение:&lt;br /&gt;
** Методом Гивенса (вращений) - &amp;lt;math&amp;gt;11n - 16&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRGivens&amp;quot;&amp;gt;[[Метод Гивенса (вращений) QR-разложения квадратной матрицы (вещественный вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
** Методом Хаусхолдера (отражений) - &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;QRHouseholder&amp;quot;&amp;gt;[[Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы, вещественный вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Перемножение матриц - &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;MatrixMultiplication&amp;quot;&amp;gt;[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение плотных неособенных матриц]]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Проверка, имеет ли матрица треугольную форму - &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Результирующая параллельная сложность одной итерации &amp;lt;math&amp;gt;12n-15&amp;lt;/math&amp;gt; (для метода вращений). А всего алгоритма из &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; итераций - &amp;lt;math&amp;gt;N*(12n-15)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Входные и выходные данные алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: плотная квадратная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объём входных данных&#039;&#039;&#039;: &amp;lt;math&amp;gt;n^2&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; собственных чисел матрицы &amp;lt;math&amp;gt;A&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;
* Перемещение данных необходимых для выполнения алгоритма не затратно, так как вычислительная мощность &amp;lt;math&amp;gt; = \frac{N * O(n^3)}{n^2 + 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;
Используется процедура [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] из библиотеки ScaLAPACK. &amp;lt;br&amp;gt;&lt;br /&gt;
Данный метод работает с матрицами в форме Хессенберга, поэтому сначала происходит приведение матрицы к данному виду с помощью процедуры [http://www.netlib.org/scalapack/explore-html/d2/d03/pdgehrd_8f.html PDGEHRD]&lt;br /&gt;
&lt;br /&gt;
Вычисления производились на суперкомпьютере Regatta.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Время работы алгоритма (сек)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|1||4.30549||25.2566||78.0507||177.054&lt;br /&gt;
|-&lt;br /&gt;
|4||3.63899||17.6559||51.2146||127.386&lt;br /&gt;
|-&lt;br /&gt;
|9||3.81662||9.19687||23.9181||53.7105&lt;br /&gt;
|-&lt;br /&gt;
|16||3.11883||7.26239||16.0958||32.3561&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Эффективность распараллеливания (%)&lt;br /&gt;
|-&lt;br /&gt;
|Процессы\Матрица||600||1200||1800||2400 &lt;br /&gt;
|-&lt;br /&gt;
|4||29.57||35.76||38.09||34.74&lt;br /&gt;
|-&lt;br /&gt;
|9||12.53||30.51||36.25||36.62&lt;br /&gt;
|-&lt;br /&gt;
|16||8.62||21.73||30.30||34.20&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Оценка масштабируемости&lt;br /&gt;
* Минимальная эффективность: 8.62%&lt;br /&gt;
* Максимальная эффективность: 38.09%&lt;br /&gt;
* По числу процессов: при увеличении числа процессов эффективность в целом уменьшается&lt;br /&gt;
* По размеру задачи: при увеличении размера задачи эффективность в целом увеличивается&lt;br /&gt;
Уменьшение или увеличение эффективности происходит не интенсивно, существенные изменения заметны только при небольшом размере задачи.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/ru/Файл:Odbaev_eigenvalues.docx Реализация алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Динамические характеристики и эффективность реализации алгоритма ==&lt;br /&gt;
== Выводы для классов архитектур ==&lt;br /&gt;
== Существующие реализации алгоритма ==&lt;br /&gt;
Полный алгоритм:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d9/d28/dgeev_8f.html DGEEV] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html PDHSEQR] (параллельная реализация)&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php алгоритма] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функции [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html linalg.eig], [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigvals.html linalg.eigvals ]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues модуль]&lt;br /&gt;
&lt;br /&gt;
QR-разложение:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d3/d69/dgeqrf_8f.html DGEQRF] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html PDGEQRF] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функция [http://www.mathworks.com/help/matlab/ref/qr.html qr]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [http://reference.wolfram.com/language/ref/QRDecomposition.html QRDecomposition]&lt;br /&gt;
* [http://alglib.sources.ru ALGLIB]: реализация [http://alglib.sources.ru/matrixops/qr.php QR-разложения] для различных языков программирования&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.qr.html linalg.qr]&lt;br /&gt;
* [http://eigen.tuxfamily.org C++ Eigen]: [http://eigen.tuxfamily.org/dox/group__QR__Module.html QR модуль]&lt;br /&gt;
&lt;br /&gt;
Умножение матриц:&lt;br /&gt;
* [http://netlib.org/lapack/ LAPACK]: функция [http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html DGEMM] (последовательная реализация)&lt;br /&gt;
* [http://www.netlib.org/scalapack/ ScaLAPACK]: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html PDGEMM] (параллельная реализация)&lt;br /&gt;
* [http://www.mathworks.com MATLAB]: функции [http://www.mathworks.com/help/matlab/ref/mtimes.html mtimes, *]&lt;br /&gt;
* [http://www.wolfram.com/mathematica/ Mathematica]: функция [https://reference.wolfram.com/language/ref/Dot.html Dot]&lt;br /&gt;
* [http://www.numpy.org Python NumPy]: функция [https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html numpy.dot]&lt;br /&gt;
&lt;br /&gt;
= Литература =&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>AlexShevelev</name></author>
	</entry>
</feed>