<?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=%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0+%D0%9A%D0%B8%D1%8F%D0%BC%D0%BE%D0%B2%D0%B0</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=%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0+%D0%9A%D0%B8%D1%8F%D0%BC%D0%BE%D0%B2%D0%B0"/>
	<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/%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0_%D0%9A%D0%B8%D1%8F%D0%BC%D0%BE%D0%B2%D0%B0"/>
	<updated>2026-10-22T20:03:16Z</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0&amp;diff=20500</id>
		<title>Обсуждение участника:Смирнова Александра</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0&amp;diff=20500"/>
		<updated>2016-12-09T19:04:59Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* По существу */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Статья [[Нахождение_собственных_чисел_квадратной_матрицы_методом_QR_разложения_(3)]] ==&lt;br /&gt;
&lt;br /&gt;
=== По существу ===&lt;br /&gt;
&lt;br /&gt;
Все приведённые реализации (и, видимо, предстоящие замеры) используют два приёма ускорения - приведение к хессенбергу и сдвиги. Но их нет в описании. Требуется переработка почти всех разделов. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:52, 10 ноября 2016 (MSK)&lt;br /&gt;
* Выполнено --[[Участник:Смирнова Александра|Смирнова Александра]] ([[Обсуждение участника:Смирнова Александра|обсуждение]]) 13:44, 19 ноября 2016 (MSK)&lt;br /&gt;
** Хорошо, во вкладке оценку исправить осталось. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 17:25, 6 декабря 2016 (MSK)&lt;br /&gt;
*** Исправлено --[[Участник:Смирнова Александра|Смирнова Александра]] ([[Обсуждение участника:Смирнова Александра|обсуждение]]) 20:24, 6 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
* К сожалению, в статье, на которую Вы ссылались, были ошибки в терминологии (это ещё незавершённая болванка). Соответственно, я ссылки подправил сам, но Вам надо посмотреть по тексту, не остались ли следы этого. --[[Участник:Frolov|Фролов А.В.]] ([[Обсуждение участника:Frolov|обсуждение]]) 12:49, 8 декабря 2016 (MSK)&lt;br /&gt;
** Исправлено (ошибки в пунктах 1.2.1.1 и 1.2.5, ссылка в списке литературы). --[[Участник:Александра Киямова|Александра Киямова]] ([[Обсуждение участника:Александра Киямова|обсуждение]]) 22:04, 9 декабря 2016 (MSK)&lt;br /&gt;
&lt;br /&gt;
=== Замечания ===&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=20499</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=20499"/>
		<updated>2016-12-09T18:59:34Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Приведение матрицы к форме Хессенберга */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&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;
Основные авторы описания: &lt;br /&gt;
*[[Участник:Смирнова_Александра|Смирнова А.С.]] - описание теоретической части&lt;br /&gt;
*[[Участник:Александра_Киямова|Киямова А.]] - описание программистской части&lt;br /&gt;
Содержательно все пункты обсуждались авторами вместе, и их вклад был равным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами. Это позволит уменьшить количество итераций алгоритма.&lt;br /&gt;
В дальнейшем, в данной статье под модифицированным алгоритмом будет пониматься алгоритм, использующий сдвиги и матрицу с формой Хессенберга. Под базовым алгоритмом будет пониматься алгоритм, не использующий данные приемы.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n-1&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
==== Приведение матрицы к форме Хессенберга ====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (почти треугольной) форме]]&lt;br /&gt;
&lt;br /&gt;
Матрицей, имеющей форму Хессенберга, называется такая матрица, у которой все элементы, находящиеся ниже первой поддиагонали, равны нулю (&amp;lt;math&amp;gt;a_{ij}=0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i&amp;lt;j+1&amp;lt;/math&amp;gt;). Пример такой матрицы приведен ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 1&amp;amp;  2&amp;amp;  3&amp;amp; 4\\ &lt;br /&gt;
 2&amp;amp;  5&amp;amp;  6&amp;amp; 7\\ &lt;br /&gt;
 0&amp;amp;  3&amp;amp;  8&amp;amp; 9\\ &lt;br /&gt;
 0&amp;amp;  0&amp;amp;  4&amp;amp; 1&lt;br /&gt;
\end{bmatrix}&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_H&amp;lt;/math&amp;gt;, имеющей форму Хессенберга (в силу подобия данные матрицы будут иметь одинаковые собственные значения). Наличие нулевых элементов в данной матрице позволяет ускорить процесс QR-разложения, причем данное ускорение будет иметь место на каждой итерации алгоритма, т.к. матрица с формой Хессенберга инвариантна относительно QR-итерации. Ускорение можно получить за счет использования модифицированного метода Гивенса(вращений) QR-разложения, который из-за изначального наличия нулевых элементов будет состоять не из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов, а из &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; шагов (будет происходить домножение только на те матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt;, у которых &amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&amp;lt;!-- Одним из способов приведения матрицы к форме Хессенберга является преобразование Хаусхолдера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Householder_transformation#Tridiagonalization%7C Wikipedia: Householder transformation]&amp;lt;/ref&amp;gt;. Данный алгоритм состоит из &amp;lt;math&amp;gt;n-1&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;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\alpha=-sgn(a_{k+1,k}^{(k)})\sqrt{\sum_{j=k+1}^{n}(a_{j,k}^{(k)})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;r=\sqrt{\frac{1}{2}(\alpha^2-a_{k+1,k}^{(k)}\alpha )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;v^{(k)}=\begin{bmatrix}v_1\\ v_2\\ \vdots \\ v_n\end{bmatrix}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{1}^{(k)}=v_{2}^{(k)}=...=v_{k}^{(k)}=0, v_{k+1}^{(k)}=\frac{a_{k+1,k}^{(k)}-\alpha}{2r}&amp;lt;/math&amp;gt;, а остальные элементы &amp;lt;math&amp;gt;v_{j}^{(k)}=\frac{a_{jk}^{(k)}}{2r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;P^{(k)}=E-2v^{(k)}(v^{(k)})^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;A^{(k+1)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^{(k+1)}=P^{(k)}A^{(k)}(P^{(k)})^T&amp;lt;/math&amp;gt;. Важно отметить, что форма, которой обладают матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;, позволяет свести данную операцию перемножения матриц к менее затратным операциям перемножения матрицы на вектор. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одним из способов приведения матрицы к форме Хессенберга является Метод Хаусхолдера (отражений)&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(почти_треугольной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (почти треугольной) форме]]&amp;lt;/ref&amp;gt;. Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга при помощи домножения ее на так называемые матрицы отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n-2&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }ww^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
В основной статье &amp;quot;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (почти треугольной) форме]]&amp;quot; данный алгоритм описан более подробно с той лишь разницей, что для QR-алгоритма нет необходимости обнулять наддиагональные элементы, как это сделано в вышеупомянутой статье.&lt;br /&gt;
&lt;br /&gt;
==== QR-алгоритм со сдвигами ====&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами позволяет сократить количество итераций, необходимых для сходимости&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;&amp;gt;Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численный методы&amp;quot;— 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&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;
&lt;br /&gt;
* На каждом шаге подбирается число &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; и ищется следующее QR-разложение: &amp;lt;math&amp;gt;A_k-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычисляется матрица &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE&amp;lt;/math&amp;gt;.&lt;br /&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;
&amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE=Q_{k}^{T}Q_kR_kQ_k+\nu_kE=Q_{k}^{T}(A_k-\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-Q_{k}^{T}(\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-\nu_kE+\nu_kE=Q_{k}^{T}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; может быть взят последний диагональный элемент матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--===== Подбор параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
//TODO--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&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_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]: вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]: вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&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-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt; при помощи модифицированного метода Гивенса (вращений). Описание вычислительного ядра не отличается от приведенного в описании базового алгоритма, единственная разница заключается в значительно меньшем количестве матриц вращения.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}-\nu_kE=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае модифицированного QR-алгоритма появляется еще макрооперация приведения матрицы к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет совершаться сдвиг и вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 nu - параметр сдвига&lt;br /&gt;
 shiftA - текущая матрица со сдвигом.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     nu = computeNu(curA)&lt;br /&gt;
     shiftA = curA - nu*E&lt;br /&gt;
     findQRdecomposition(shiftA,Q,R)&lt;br /&gt;
     nextA = R*Q + nu*E&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
&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;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит заметить, что вычисление сдвигов по сравнению с другими операциями не обладает высокой сложностью, однако позволяет значительно сократить количество необходимых итераций.&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Сложность всего алгоритма, с учетом приведения матрицы к форме Хессенберга, будет равна &amp;lt;math&amp;gt;O(n^3)+N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
На рисунках 1 и 2 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
* &#039;&#039;&#039;Iter&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - итерация алгоритма&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Base_All.png|center|frame|Рисунок 1. Информационный граф базового QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Base_Iter.png|center|frame|Рисунок 2. Информационный граф итерации базового QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; (рис.3) и &#039;&#039;&#039;Dif&#039;&#039;&#039; (рис.4) на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 4. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На рисунках 5 и 6 изображен информационный граф модифицированного QR-алгоритма. Дополнительные вершины для этого графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;Shift&#039;&#039;&#039; - операция сдвига&lt;br /&gt;
* &#039;&#039;&#039;H&#039;&#039;&#039; - операция приведения матрицы к форме Хессенберга&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Mod_All.png|center|frame|Рисунок 5. Информационный граф модифицированного QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Mod_Iter.png|center|frame|Рисунок 6. Информационный граф итерации модифицированного QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Отличия от базового алгоритма заключаются в следующем:&lt;br /&gt;
# Приведение матрицы к форме Хессенберга имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# QR-разложение матрицы модифицированным методом Гивенса (вращений) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Операция сдвига (вычитание из диагональных элементов матрицы одного числа) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, итоговые характеристики всего модифицированного алгоритма будут следующие: высота ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)+N*O(n)&amp;lt;/math&amp;gt; и ширина ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
Масштабируемость алгоритма (рис.7) исследовалась на основе реализации алгоритма в библиотеке [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]. Время работы было замерено для различных размеров матрицы, а также различного числа процессоров. &lt;br /&gt;
&lt;br /&gt;
[[Файл:QRPerfomance.png|center|frame|Рисунок 7. Масштабируемость QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
При увеличении числа процессоров время работы программы увеличивается при малом размере матрицы, распараллеливание алгоритма неэффективно. Однако при больших размерах матрицы (более &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; 10^3\times10^3&amp;lt;/math&amp;gt;) время работы параллельной реализации значительно меньше последовательной.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/pool/File:QR-Kiyamova-Smirnova.docx Код программы]&lt;br /&gt;
&lt;br /&gt;
Все вычисления были проведены на суперкомпьютере [http://hpc.cs.msu.su/regatta Regatta]. Библиотека [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0] была установлена вручную.&lt;br /&gt;
Компиляция проводилась с использованием компилятора mpicxx с опциями -lscalapack и -llapack с указанием полного пути до используемых библиотек.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=20498</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=20498"/>
		<updated>2016-12-09T18:59:08Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Приведение матрицы к форме Хессенберга */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&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;
Основные авторы описания: &lt;br /&gt;
*[[Участник:Смирнова_Александра|Смирнова А.С.]] - описание теоретической части&lt;br /&gt;
*[[Участник:Александра_Киямова|Киямова А.]] - описание программистской части&lt;br /&gt;
Содержательно все пункты обсуждались авторами вместе, и их вклад был равным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами. Это позволит уменьшить количество итераций алгоритма.&lt;br /&gt;
В дальнейшем, в данной статье под модифицированным алгоритмом будет пониматься алгоритм, использующий сдвиги и матрицу с формой Хессенберга. Под базовым алгоритмом будет пониматься алгоритм, не использующий данные приемы.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n-1&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
==== Приведение матрицы к форме Хессенберга ====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (почти треугольной) форме]]&lt;br /&gt;
&lt;br /&gt;
Матрицей, имеющей форму Хессенберга, называется такая матрица, у которой все элементы, находящиеся ниже первой поддиагонали, равны нулю (&amp;lt;math&amp;gt;a_{ij}=0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i&amp;lt;j+1&amp;lt;/math&amp;gt;). Пример такой матрицы приведен ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 1&amp;amp;  2&amp;amp;  3&amp;amp; 4\\ &lt;br /&gt;
 2&amp;amp;  5&amp;amp;  6&amp;amp; 7\\ &lt;br /&gt;
 0&amp;amp;  3&amp;amp;  8&amp;amp; 9\\ &lt;br /&gt;
 0&amp;amp;  0&amp;amp;  4&amp;amp; 1&lt;br /&gt;
\end{bmatrix}&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_H&amp;lt;/math&amp;gt;, имеющей форму Хессенберга (в силу подобия данные матрицы будут иметь одинаковые собственные значения). Наличие нулевых элементов в данной матрице позволяет ускорить процесс QR-разложения, причем данное ускорение будет иметь место на каждой итерации алгоритма, т.к. матрица с формой Хессенберга инвариантна относительно QR-итерации. Ускорение можно получить за счет использования модифицированного метода Гивенса(вращений) QR-разложения, который из-за изначального наличия нулевых элементов будет состоять не из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов, а из &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; шагов (будет происходить домножение только на те матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt;, у которых &amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&amp;lt;!-- Одним из способов приведения матрицы к форме Хессенберга является преобразование Хаусхолдера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Householder_transformation#Tridiagonalization%7C Wikipedia: Householder transformation]&amp;lt;/ref&amp;gt;. Данный алгоритм состоит из &amp;lt;math&amp;gt;n-1&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;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\alpha=-sgn(a_{k+1,k}^{(k)})\sqrt{\sum_{j=k+1}^{n}(a_{j,k}^{(k)})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;r=\sqrt{\frac{1}{2}(\alpha^2-a_{k+1,k}^{(k)}\alpha )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;v^{(k)}=\begin{bmatrix}v_1\\ v_2\\ \vdots \\ v_n\end{bmatrix}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{1}^{(k)}=v_{2}^{(k)}=...=v_{k}^{(k)}=0, v_{k+1}^{(k)}=\frac{a_{k+1,k}^{(k)}-\alpha}{2r}&amp;lt;/math&amp;gt;, а остальные элементы &amp;lt;math&amp;gt;v_{j}^{(k)}=\frac{a_{jk}^{(k)}}{2r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;P^{(k)}=E-2v^{(k)}(v^{(k)})^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;A^{(k+1)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^{(k+1)}=P^{(k)}A^{(k)}(P^{(k)})^T&amp;lt;/math&amp;gt;. Важно отметить, что форма, которой обладают матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;, позволяет свести данную операцию перемножения матриц к менее затратным операциям перемножения матрицы на вектор. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одним из способов приведения матрицы к форме Хессенберга является Метод Хаусхолдера (отражений)&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(почти_треугольной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (почти_треугольной) форме]]&amp;lt;/ref&amp;gt;. Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга при помощи домножения ее на так называемые матрицы отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n-2&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }ww^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
В основной статье &amp;quot;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (почти треугольной) форме]]&amp;quot; данный алгоритм описан более подробно с той лишь разницей, что для QR-алгоритма нет необходимости обнулять наддиагональные элементы, как это сделано в вышеупомянутой статье.&lt;br /&gt;
&lt;br /&gt;
==== QR-алгоритм со сдвигами ====&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами позволяет сократить количество итераций, необходимых для сходимости&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;&amp;gt;Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численный методы&amp;quot;— 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&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;
&lt;br /&gt;
* На каждом шаге подбирается число &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; и ищется следующее QR-разложение: &amp;lt;math&amp;gt;A_k-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычисляется матрица &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE&amp;lt;/math&amp;gt;.&lt;br /&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;
&amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE=Q_{k}^{T}Q_kR_kQ_k+\nu_kE=Q_{k}^{T}(A_k-\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-Q_{k}^{T}(\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-\nu_kE+\nu_kE=Q_{k}^{T}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; может быть взят последний диагональный элемент матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--===== Подбор параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
//TODO--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&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_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]: вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]: вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&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-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt; при помощи модифицированного метода Гивенса (вращений). Описание вычислительного ядра не отличается от приведенного в описании базового алгоритма, единственная разница заключается в значительно меньшем количестве матриц вращения.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}-\nu_kE=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае модифицированного QR-алгоритма появляется еще макрооперация приведения матрицы к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет совершаться сдвиг и вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 nu - параметр сдвига&lt;br /&gt;
 shiftA - текущая матрица со сдвигом.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     nu = computeNu(curA)&lt;br /&gt;
     shiftA = curA - nu*E&lt;br /&gt;
     findQRdecomposition(shiftA,Q,R)&lt;br /&gt;
     nextA = R*Q + nu*E&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
&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;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит заметить, что вычисление сдвигов по сравнению с другими операциями не обладает высокой сложностью, однако позволяет значительно сократить количество необходимых итераций.&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Сложность всего алгоритма, с учетом приведения матрицы к форме Хессенберга, будет равна &amp;lt;math&amp;gt;O(n^3)+N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
На рисунках 1 и 2 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
* &#039;&#039;&#039;Iter&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - итерация алгоритма&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Base_All.png|center|frame|Рисунок 1. Информационный граф базового QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Base_Iter.png|center|frame|Рисунок 2. Информационный граф итерации базового QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; (рис.3) и &#039;&#039;&#039;Dif&#039;&#039;&#039; (рис.4) на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 4. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На рисунках 5 и 6 изображен информационный граф модифицированного QR-алгоритма. Дополнительные вершины для этого графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;Shift&#039;&#039;&#039; - операция сдвига&lt;br /&gt;
* &#039;&#039;&#039;H&#039;&#039;&#039; - операция приведения матрицы к форме Хессенберга&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Mod_All.png|center|frame|Рисунок 5. Информационный граф модифицированного QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Mod_Iter.png|center|frame|Рисунок 6. Информационный граф итерации модифицированного QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Отличия от базового алгоритма заключаются в следующем:&lt;br /&gt;
# Приведение матрицы к форме Хессенберга имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# QR-разложение матрицы модифицированным методом Гивенса (вращений) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Операция сдвига (вычитание из диагональных элементов матрицы одного числа) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, итоговые характеристики всего модифицированного алгоритма будут следующие: высота ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)+N*O(n)&amp;lt;/math&amp;gt; и ширина ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
Масштабируемость алгоритма (рис.7) исследовалась на основе реализации алгоритма в библиотеке [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]. Время работы было замерено для различных размеров матрицы, а также различного числа процессоров. &lt;br /&gt;
&lt;br /&gt;
[[Файл:QRPerfomance.png|center|frame|Рисунок 7. Масштабируемость QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
При увеличении числа процессоров время работы программы увеличивается при малом размере матрицы, распараллеливание алгоритма неэффективно. Однако при больших размерах матрицы (более &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; 10^3\times10^3&amp;lt;/math&amp;gt;) время работы параллельной реализации значительно меньше последовательной.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/pool/File:QR-Kiyamova-Smirnova.docx Код программы]&lt;br /&gt;
&lt;br /&gt;
Все вычисления были проведены на суперкомпьютере [http://hpc.cs.msu.su/regatta Regatta]. Библиотека [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0] была установлена вручную.&lt;br /&gt;
Компиляция проводилась с использованием компилятора mpicxx с опциями -lscalapack и -llapack с указанием полного пути до используемых библиотек.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=20497</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=20497"/>
		<updated>2016-12-09T18:55:03Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Приведение матрицы к форме Хессенберга */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&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;
Основные авторы описания: &lt;br /&gt;
*[[Участник:Смирнова_Александра|Смирнова А.С.]] - описание теоретической части&lt;br /&gt;
*[[Участник:Александра_Киямова|Киямова А.]] - описание программистской части&lt;br /&gt;
Содержательно все пункты обсуждались авторами вместе, и их вклад был равным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами. Это позволит уменьшить количество итераций алгоритма.&lt;br /&gt;
В дальнейшем, в данной статье под модифицированным алгоритмом будет пониматься алгоритм, использующий сдвиги и матрицу с формой Хессенберга. Под базовым алгоритмом будет пониматься алгоритм, не использующий данные приемы.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n-1&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
==== Приведение матрицы к форме Хессенберга ====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (почти треугольной) форме]]&lt;br /&gt;
&lt;br /&gt;
Матрицей, имеющей форму Хессенберга, называется такая матрица, у которой все элементы, находящиеся ниже первой поддиагонали, равны нулю (&amp;lt;math&amp;gt;a_{ij}=0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i&amp;lt;j+1&amp;lt;/math&amp;gt;). Пример такой матрицы приведен ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 1&amp;amp;  2&amp;amp;  3&amp;amp; 4\\ &lt;br /&gt;
 2&amp;amp;  5&amp;amp;  6&amp;amp; 7\\ &lt;br /&gt;
 0&amp;amp;  3&amp;amp;  8&amp;amp; 9\\ &lt;br /&gt;
 0&amp;amp;  0&amp;amp;  4&amp;amp; 1&lt;br /&gt;
\end{bmatrix}&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_H&amp;lt;/math&amp;gt;, имеющей форму Хессенберга (в силу подобия данные матрицы будут иметь одинаковые собственные значения). Наличие нулевых элементов в данной матрице позволяет ускорить процесс QR-разложения, причем данное ускорение будет иметь место на каждой итерации алгоритма, т.к. матрица с формой Хессенберга инвариантна относительно QR-итерации. Ускорение можно получить за счет использования модифицированного метода Гивенса(вращений) QR-разложения, который из-за изначального наличия нулевых элементов будет состоять не из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов, а из &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; шагов (будет происходить домножение только на те матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt;, у которых &amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&amp;lt;!-- Одним из способов приведения матрицы к форме Хессенберга является преобразование Хаусхолдера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Householder_transformation#Tridiagonalization%7C Wikipedia: Householder transformation]&amp;lt;/ref&amp;gt;. Данный алгоритм состоит из &amp;lt;math&amp;gt;n-1&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;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\alpha=-sgn(a_{k+1,k}^{(k)})\sqrt{\sum_{j=k+1}^{n}(a_{j,k}^{(k)})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;r=\sqrt{\frac{1}{2}(\alpha^2-a_{k+1,k}^{(k)}\alpha )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;v^{(k)}=\begin{bmatrix}v_1\\ v_2\\ \vdots \\ v_n\end{bmatrix}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{1}^{(k)}=v_{2}^{(k)}=...=v_{k}^{(k)}=0, v_{k+1}^{(k)}=\frac{a_{k+1,k}^{(k)}-\alpha}{2r}&amp;lt;/math&amp;gt;, а остальные элементы &amp;lt;math&amp;gt;v_{j}^{(k)}=\frac{a_{jk}^{(k)}}{2r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;P^{(k)}=E-2v^{(k)}(v^{(k)})^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;A^{(k+1)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^{(k+1)}=P^{(k)}A^{(k)}(P^{(k)})^T&amp;lt;/math&amp;gt;. Важно отметить, что форма, которой обладают матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;, позволяет свести данную операцию перемножения матриц к менее затратным операциям перемножения матрицы на вектор. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одним из способов приведения матрицы к форме Хессенберга является Метод Хаусхолдера (отражений)&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(почти_треугольной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;lt;/ref&amp;gt;. Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга при помощи домножения ее на так называемые матрицы отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n-2&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }ww^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
В основной статье &amp;quot;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (почти треугольной) форме]]&amp;quot; данный алгоритм описан более подробно с той лишь разницей, что для QR-алгоритма нет необходимости обнулять наддиагональные элементы, как это сделано в вышеупомянутой статье.&lt;br /&gt;
&lt;br /&gt;
==== QR-алгоритм со сдвигами ====&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами позволяет сократить количество итераций, необходимых для сходимости&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;&amp;gt;Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численный методы&amp;quot;— 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&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;
&lt;br /&gt;
* На каждом шаге подбирается число &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; и ищется следующее QR-разложение: &amp;lt;math&amp;gt;A_k-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычисляется матрица &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE&amp;lt;/math&amp;gt;.&lt;br /&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;
&amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE=Q_{k}^{T}Q_kR_kQ_k+\nu_kE=Q_{k}^{T}(A_k-\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-Q_{k}^{T}(\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-\nu_kE+\nu_kE=Q_{k}^{T}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; может быть взят последний диагональный элемент матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--===== Подбор параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
//TODO--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&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_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]: вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]: вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&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-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt; при помощи модифицированного метода Гивенса (вращений). Описание вычислительного ядра не отличается от приведенного в описании базового алгоритма, единственная разница заключается в значительно меньшем количестве матриц вращения.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}-\nu_kE=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае модифицированного QR-алгоритма появляется еще макрооперация приведения матрицы к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет совершаться сдвиг и вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 nu - параметр сдвига&lt;br /&gt;
 shiftA - текущая матрица со сдвигом.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     nu = computeNu(curA)&lt;br /&gt;
     shiftA = curA - nu*E&lt;br /&gt;
     findQRdecomposition(shiftA,Q,R)&lt;br /&gt;
     nextA = R*Q + nu*E&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
&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;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит заметить, что вычисление сдвигов по сравнению с другими операциями не обладает высокой сложностью, однако позволяет значительно сократить количество необходимых итераций.&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Сложность всего алгоритма, с учетом приведения матрицы к форме Хессенберга, будет равна &amp;lt;math&amp;gt;O(n^3)+N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
На рисунках 1 и 2 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
* &#039;&#039;&#039;Iter&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - итерация алгоритма&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Base_All.png|center|frame|Рисунок 1. Информационный граф базового QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Base_Iter.png|center|frame|Рисунок 2. Информационный граф итерации базового QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; (рис.3) и &#039;&#039;&#039;Dif&#039;&#039;&#039; (рис.4) на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 4. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На рисунках 5 и 6 изображен информационный граф модифицированного QR-алгоритма. Дополнительные вершины для этого графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;Shift&#039;&#039;&#039; - операция сдвига&lt;br /&gt;
* &#039;&#039;&#039;H&#039;&#039;&#039; - операция приведения матрицы к форме Хессенберга&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Mod_All.png|center|frame|Рисунок 5. Информационный граф модифицированного QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Mod_Iter.png|center|frame|Рисунок 6. Информационный граф итерации модифицированного QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Отличия от базового алгоритма заключаются в следующем:&lt;br /&gt;
# Приведение матрицы к форме Хессенберга имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# QR-разложение матрицы модифицированным методом Гивенса (вращений) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Операция сдвига (вычитание из диагональных элементов матрицы одного числа) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, итоговые характеристики всего модифицированного алгоритма будут следующие: высота ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)+N*O(n)&amp;lt;/math&amp;gt; и ширина ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
Масштабируемость алгоритма (рис.7) исследовалась на основе реализации алгоритма в библиотеке [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]. Время работы было замерено для различных размеров матрицы, а также различного числа процессоров. &lt;br /&gt;
&lt;br /&gt;
[[Файл:QRPerfomance.png|center|frame|Рисунок 7. Масштабируемость QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
При увеличении числа процессоров время работы программы увеличивается при малом размере матрицы, распараллеливание алгоритма неэффективно. Однако при больших размерах матрицы (более &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; 10^3\times10^3&amp;lt;/math&amp;gt;) время работы параллельной реализации значительно меньше последовательной.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/pool/File:QR-Kiyamova-Smirnova.docx Код программы]&lt;br /&gt;
&lt;br /&gt;
Все вычисления были проведены на суперкомпьютере [http://hpc.cs.msu.su/regatta Regatta]. Библиотека [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0] была установлена вручную.&lt;br /&gt;
Компиляция проводилась с использованием компилятора mpicxx с опциями -lscalapack и -llapack с указанием полного пути до используемых библиотек.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=20496</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=20496"/>
		<updated>2016-12-09T18:52:18Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Приведение матрицы к форме Хессенберга */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&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;
Основные авторы описания: &lt;br /&gt;
*[[Участник:Смирнова_Александра|Смирнова А.С.]] - описание теоретической части&lt;br /&gt;
*[[Участник:Александра_Киямова|Киямова А.]] - описание программистской части&lt;br /&gt;
Содержательно все пункты обсуждались авторами вместе, и их вклад был равным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами. Это позволит уменьшить количество итераций алгоритма.&lt;br /&gt;
В дальнейшем, в данной статье под модифицированным алгоритмом будет пониматься алгоритм, использующий сдвиги и матрицу с формой Хессенберга. Под базовым алгоритмом будет пониматься алгоритм, не использующий данные приемы.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n-1&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
==== Приведение матрицы к форме Хессенберга ====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (почти треугольной) форме]]&lt;br /&gt;
&lt;br /&gt;
Матрицей, имеющей форму Хессенберга, называется такая матрица, у которой все элементы, находящиеся ниже первой поддиагонали, равны нулю (&amp;lt;math&amp;gt;a_{ij}=0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i&amp;lt;j+1&amp;lt;/math&amp;gt;). Пример такой матрицы приведен ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 1&amp;amp;  2&amp;amp;  3&amp;amp; 4\\ &lt;br /&gt;
 2&amp;amp;  5&amp;amp;  6&amp;amp; 7\\ &lt;br /&gt;
 0&amp;amp;  3&amp;amp;  8&amp;amp; 9\\ &lt;br /&gt;
 0&amp;amp;  0&amp;amp;  4&amp;amp; 1&lt;br /&gt;
\end{bmatrix}&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_H&amp;lt;/math&amp;gt;, имеющей форму Хессенберга (в силу подобия данные матрицы будут иметь одинаковые собственные значения). Наличие нулевых элементов в данной матрице позволяет ускорить процесс QR-разложения, причем данное ускорение будет иметь место на каждой итерации алгоритма, т.к. матрица с формой Хессенберга инвариантна относительно QR-итерации. Ускорение можно получить за счет использования модифицированного метода Гивенса(вращений) QR-разложения, который из-за изначального наличия нулевых элементов будет состоять не из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов, а из &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; шагов (будет происходить домножение только на те матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt;, у которых &amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&amp;lt;!-- Одним из способов приведения матрицы к форме Хессенберга является преобразование Хаусхолдера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Householder_transformation#Tridiagonalization%7C Wikipedia: Householder transformation]&amp;lt;/ref&amp;gt;. Данный алгоритм состоит из &amp;lt;math&amp;gt;n-1&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;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\alpha=-sgn(a_{k+1,k}^{(k)})\sqrt{\sum_{j=k+1}^{n}(a_{j,k}^{(k)})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;r=\sqrt{\frac{1}{2}(\alpha^2-a_{k+1,k}^{(k)}\alpha )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;v^{(k)}=\begin{bmatrix}v_1\\ v_2\\ \vdots \\ v_n\end{bmatrix}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{1}^{(k)}=v_{2}^{(k)}=...=v_{k}^{(k)}=0, v_{k+1}^{(k)}=\frac{a_{k+1,k}^{(k)}-\alpha}{2r}&amp;lt;/math&amp;gt;, а остальные элементы &amp;lt;math&amp;gt;v_{j}^{(k)}=\frac{a_{jk}^{(k)}}{2r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;P^{(k)}=E-2v^{(k)}(v^{(k)})^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;A^{(k+1)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^{(k+1)}=P^{(k)}A^{(k)}(P^{(k)})^T&amp;lt;/math&amp;gt;. Важно отметить, что форма, которой обладают матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;, позволяет свести данную операцию перемножения матриц к менее затратным операциям перемножения матрицы на вектор. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одним из способов приведения матрицы к форме Хессенберга является Метод Хаусхолдера (отражений)&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;lt;/ref&amp;gt;. Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга при помощи домножения ее на так называемые матрицы отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n-2&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }ww^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
В основной статье &amp;quot;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (почти треугольной) форме]]&amp;quot; данный алгоритм описан более подробно с той лишь разницей, что для QR-алгоритма нет необходимости обнулять наддиагональные элементы, как это сделано в вышеупомянутой статье.&lt;br /&gt;
&lt;br /&gt;
==== QR-алгоритм со сдвигами ====&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами позволяет сократить количество итераций, необходимых для сходимости&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;&amp;gt;Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численный методы&amp;quot;— 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&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;
&lt;br /&gt;
* На каждом шаге подбирается число &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; и ищется следующее QR-разложение: &amp;lt;math&amp;gt;A_k-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычисляется матрица &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE&amp;lt;/math&amp;gt;.&lt;br /&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;
&amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE=Q_{k}^{T}Q_kR_kQ_k+\nu_kE=Q_{k}^{T}(A_k-\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-Q_{k}^{T}(\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-\nu_kE+\nu_kE=Q_{k}^{T}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; может быть взят последний диагональный элемент матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--===== Подбор параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
//TODO--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&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_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]: вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]: вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&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-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt; при помощи модифицированного метода Гивенса (вращений). Описание вычислительного ядра не отличается от приведенного в описании базового алгоритма, единственная разница заключается в значительно меньшем количестве матриц вращения.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}-\nu_kE=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае модифицированного QR-алгоритма появляется еще макрооперация приведения матрицы к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет совершаться сдвиг и вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 nu - параметр сдвига&lt;br /&gt;
 shiftA - текущая матрица со сдвигом.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     nu = computeNu(curA)&lt;br /&gt;
     shiftA = curA - nu*E&lt;br /&gt;
     findQRdecomposition(shiftA,Q,R)&lt;br /&gt;
     nextA = R*Q + nu*E&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
&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;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит заметить, что вычисление сдвигов по сравнению с другими операциями не обладает высокой сложностью, однако позволяет значительно сократить количество необходимых итераций.&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Сложность всего алгоритма, с учетом приведения матрицы к форме Хессенберга, будет равна &amp;lt;math&amp;gt;O(n^3)+N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
На рисунках 1 и 2 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
* &#039;&#039;&#039;Iter&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - итерация алгоритма&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Base_All.png|center|frame|Рисунок 1. Информационный граф базового QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Base_Iter.png|center|frame|Рисунок 2. Информационный граф итерации базового QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; (рис.3) и &#039;&#039;&#039;Dif&#039;&#039;&#039; (рис.4) на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 4. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На рисунках 5 и 6 изображен информационный граф модифицированного QR-алгоритма. Дополнительные вершины для этого графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;Shift&#039;&#039;&#039; - операция сдвига&lt;br /&gt;
* &#039;&#039;&#039;H&#039;&#039;&#039; - операция приведения матрицы к форме Хессенберга&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Mod_All.png|center|frame|Рисунок 5. Информационный граф модифицированного QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Mod_Iter.png|center|frame|Рисунок 6. Информационный граф итерации модифицированного QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Отличия от базового алгоритма заключаются в следующем:&lt;br /&gt;
# Приведение матрицы к форме Хессенберга имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# QR-разложение матрицы модифицированным методом Гивенса (вращений) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Операция сдвига (вычитание из диагональных элементов матрицы одного числа) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, итоговые характеристики всего модифицированного алгоритма будут следующие: высота ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)+N*O(n)&amp;lt;/math&amp;gt; и ширина ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
Масштабируемость алгоритма (рис.7) исследовалась на основе реализации алгоритма в библиотеке [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]. Время работы было замерено для различных размеров матрицы, а также различного числа процессоров. &lt;br /&gt;
&lt;br /&gt;
[[Файл:QRPerfomance.png|center|frame|Рисунок 7. Масштабируемость QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
При увеличении числа процессоров время работы программы увеличивается при малом размере матрицы, распараллеливание алгоритма неэффективно. Однако при больших размерах матрицы (более &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; 10^3\times10^3&amp;lt;/math&amp;gt;) время работы параллельной реализации значительно меньше последовательной.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/pool/File:QR-Kiyamova-Smirnova.docx Код программы]&lt;br /&gt;
&lt;br /&gt;
Все вычисления были проведены на суперкомпьютере [http://hpc.cs.msu.su/regatta Regatta]. Библиотека [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0] была установлена вручную.&lt;br /&gt;
Компиляция проводилась с использованием компилятора mpicxx с опциями -lscalapack и -llapack с указанием полного пути до используемых библиотек.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=20495</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=20495"/>
		<updated>2016-12-09T18:51:35Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Приведение матрицы к форме Хессенберга */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&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;
Основные авторы описания: &lt;br /&gt;
*[[Участник:Смирнова_Александра|Смирнова А.С.]] - описание теоретической части&lt;br /&gt;
*[[Участник:Александра_Киямова|Киямова А.]] - описание программистской части&lt;br /&gt;
Содержательно все пункты обсуждались авторами вместе, и их вклад был равным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами. Это позволит уменьшить количество итераций алгоритма.&lt;br /&gt;
В дальнейшем, в данной статье под модифицированным алгоритмом будет пониматься алгоритм, использующий сдвиги и матрицу с формой Хессенберга. Под базовым алгоритмом будет пониматься алгоритм, не использующий данные приемы.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n-1&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
==== Приведение матрицы к форме Хессенберга ====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (почти треугольной) форме]]&lt;br /&gt;
&lt;br /&gt;
Матрицей, имеющей форму Хессенберга, называется такая матрица, у которой все элементы, находящиеся ниже первой поддиагонали, равны нулю (&amp;lt;math&amp;gt;a_{ij}=0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i&amp;lt;j+1&amp;lt;/math&amp;gt;). Пример такой матрицы приведен ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 1&amp;amp;  2&amp;amp;  3&amp;amp; 4\\ &lt;br /&gt;
 2&amp;amp;  5&amp;amp;  6&amp;amp; 7\\ &lt;br /&gt;
 0&amp;amp;  3&amp;amp;  8&amp;amp; 9\\ &lt;br /&gt;
 0&amp;amp;  0&amp;amp;  4&amp;amp; 1&lt;br /&gt;
\end{bmatrix}&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_H&amp;lt;/math&amp;gt;, имеющей форму Хессенберга (в силу подобия данные матрицы будут иметь одинаковые собственные значения). Наличие нулевых элементов в данной матрице позволяет ускорить процесс QR-разложения, причем данное ускорение будет иметь место на каждой итерации алгоритма, т.к. матрица с формой Хессенберга инвариантна относительно QR-итерации. Ускорение можно получить за счет использования модифицированного метода Гивенса(вращений) QR-разложения, который из-за изначального наличия нулевых элементов будет состоять не из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов, а из &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; шагов (будет происходить домножение только на те матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt;, у которых &amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&amp;lt;!-- Одним из способов приведения матрицы к форме Хессенберга является преобразование Хаусхолдера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Householder_transformation#Tridiagonalization%7C Wikipedia: Householder transformation]&amp;lt;/ref&amp;gt;. Данный алгоритм состоит из &amp;lt;math&amp;gt;n-1&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;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\alpha=-sgn(a_{k+1,k}^{(k)})\sqrt{\sum_{j=k+1}^{n}(a_{j,k}^{(k)})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;r=\sqrt{\frac{1}{2}(\alpha^2-a_{k+1,k}^{(k)}\alpha )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;v^{(k)}=\begin{bmatrix}v_1\\ v_2\\ \vdots \\ v_n\end{bmatrix}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{1}^{(k)}=v_{2}^{(k)}=...=v_{k}^{(k)}=0, v_{k+1}^{(k)}=\frac{a_{k+1,k}^{(k)}-\alpha}{2r}&amp;lt;/math&amp;gt;, а остальные элементы &amp;lt;math&amp;gt;v_{j}^{(k)}=\frac{a_{jk}^{(k)}}{2r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;P^{(k)}=E-2v^{(k)}(v^{(k)})^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;A^{(k+1)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^{(k+1)}=P^{(k)}A^{(k)}(P^{(k)})^T&amp;lt;/math&amp;gt;. Важно отметить, что форма, которой обладают матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;, позволяет свести данную операцию перемножения матриц к менее затратным операциям перемножения матрицы на вектор. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одним из способов приведения матрицы к форме Хессенберга является Метод Хаусхолдера (отражений)&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;lt;/ref&amp;gt;. Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга при помощи домножения ее на так называемые матрицы отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;n-2&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }ww^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
В основной статье &amp;quot;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (почти треугольной) форме]]&amp;quot; данный алгоритм описан более подробно с той лишь разницей, что для QR-алгоритма нет необходимости обнулять наддиагональные элементы, как это сделано в вышеупомянутой статье.&lt;br /&gt;
&lt;br /&gt;
==== QR-алгоритм со сдвигами ====&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами позволяет сократить количество итераций, необходимых для сходимости&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;&amp;gt;Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численный методы&amp;quot;— 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&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;
&lt;br /&gt;
* На каждом шаге подбирается число &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; и ищется следующее QR-разложение: &amp;lt;math&amp;gt;A_k-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычисляется матрица &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE&amp;lt;/math&amp;gt;.&lt;br /&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;
&amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE=Q_{k}^{T}Q_kR_kQ_k+\nu_kE=Q_{k}^{T}(A_k-\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-Q_{k}^{T}(\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-\nu_kE+\nu_kE=Q_{k}^{T}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; может быть взят последний диагональный элемент матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--===== Подбор параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
//TODO--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&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_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]: вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]: вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&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-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt; при помощи модифицированного метода Гивенса (вращений). Описание вычислительного ядра не отличается от приведенного в описании базового алгоритма, единственная разница заключается в значительно меньшем количестве матриц вращения.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}-\nu_kE=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае модифицированного QR-алгоритма появляется еще макрооперация приведения матрицы к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет совершаться сдвиг и вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 nu - параметр сдвига&lt;br /&gt;
 shiftA - текущая матрица со сдвигом.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     nu = computeNu(curA)&lt;br /&gt;
     shiftA = curA - nu*E&lt;br /&gt;
     findQRdecomposition(shiftA,Q,R)&lt;br /&gt;
     nextA = R*Q + nu*E&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
&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;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит заметить, что вычисление сдвигов по сравнению с другими операциями не обладает высокой сложностью, однако позволяет значительно сократить количество необходимых итераций.&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Сложность всего алгоритма, с учетом приведения матрицы к форме Хессенберга, будет равна &amp;lt;math&amp;gt;O(n^3)+N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
На рисунках 1 и 2 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
* &#039;&#039;&#039;Iter&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - итерация алгоритма&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Base_All.png|center|frame|Рисунок 1. Информационный граф базового QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Base_Iter.png|center|frame|Рисунок 2. Информационный граф итерации базового QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; (рис.3) и &#039;&#039;&#039;Dif&#039;&#039;&#039; (рис.4) на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 4. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На рисунках 5 и 6 изображен информационный граф модифицированного QR-алгоритма. Дополнительные вершины для этого графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;Shift&#039;&#039;&#039; - операция сдвига&lt;br /&gt;
* &#039;&#039;&#039;H&#039;&#039;&#039; - операция приведения матрицы к форме Хессенберга&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Mod_All.png|center|frame|Рисунок 5. Информационный граф модифицированного QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Mod_Iter.png|center|frame|Рисунок 6. Информационный граф итерации модифицированного QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Отличия от базового алгоритма заключаются в следующем:&lt;br /&gt;
# Приведение матрицы к форме Хессенберга имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# QR-разложение матрицы модифицированным методом Гивенса (вращений) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Операция сдвига (вычитание из диагональных элементов матрицы одного числа) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, итоговые характеристики всего модифицированного алгоритма будут следующие: высота ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)+N*O(n)&amp;lt;/math&amp;gt; и ширина ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
Масштабируемость алгоритма (рис.7) исследовалась на основе реализации алгоритма в библиотеке [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]. Время работы было замерено для различных размеров матрицы, а также различного числа процессоров. &lt;br /&gt;
&lt;br /&gt;
[[Файл:QRPerfomance.png|center|frame|Рисунок 7. Масштабируемость QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
При увеличении числа процессоров время работы программы увеличивается при малом размере матрицы, распараллеливание алгоритма неэффективно. Однако при больших размерах матрицы (более &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; 10^3\times10^3&amp;lt;/math&amp;gt;) время работы параллельной реализации значительно меньше последовательной.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/pool/File:QR-Kiyamova-Smirnova.docx Код программы]&lt;br /&gt;
&lt;br /&gt;
Все вычисления были проведены на суперкомпьютере [http://hpc.cs.msu.su/regatta Regatta]. Библиотека [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0] была установлена вручную.&lt;br /&gt;
Компиляция проводилась с использованием компилятора mpicxx с опциями -lscalapack и -llapack с указанием полного пути до используемых библиотек.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=20494</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=20494"/>
		<updated>2016-12-09T18:49:49Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment|VadimVV}}&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;
Основные авторы описания: &lt;br /&gt;
*[[Участник:Смирнова_Александра|Смирнова А.С.]] - описание теоретической части&lt;br /&gt;
*[[Участник:Александра_Киямова|Киямова А.]] - описание программистской части&lt;br /&gt;
Содержательно все пункты обсуждались авторами вместе, и их вклад был равным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами. Это позволит уменьшить количество итераций алгоритма.&lt;br /&gt;
В дальнейшем, в данной статье под модифицированным алгоритмом будет пониматься алгоритм, использующий сдвиги и матрицу с формой Хессенберга. Под базовым алгоритмом будет пониматься алгоритм, не использующий данные приемы.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n-1&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
==== Приведение матрицы к форме Хессенберга ====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (почти треугольной) форме]]&lt;br /&gt;
&lt;br /&gt;
Матрицей, имеющей форму Хессенберга, называется такая матрица, у которой все элементы, находящиеся ниже первой поддиагонали, равны нулю (&amp;lt;math&amp;gt;a_{ij}=0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i&amp;lt;j+1&amp;lt;/math&amp;gt;). Пример такой матрицы приведен ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 1&amp;amp;  2&amp;amp;  3&amp;amp; 4\\ &lt;br /&gt;
 2&amp;amp;  5&amp;amp;  6&amp;amp; 7\\ &lt;br /&gt;
 0&amp;amp;  3&amp;amp;  8&amp;amp; 9\\ &lt;br /&gt;
 0&amp;amp;  0&amp;amp;  4&amp;amp; 1&lt;br /&gt;
\end{bmatrix}&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_H&amp;lt;/math&amp;gt;, имеющей форму Хессенберга (в силу подобия данные матрицы будут иметь одинаковые собственные значения). Наличие нулевых элементов в данной матрице позволяет ускорить процесс QR-разложения, причем данное ускорение будет иметь место на каждой итерации алгоритма, т.к. матрица с формой Хессенберга инвариантна относительно QR-итерации. Ускорение можно получить за счет использования модифицированного метода Гивенса(вращений) QR-разложения, который из-за изначального наличия нулевых элементов будет состоять не из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов, а из &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; шагов (будет происходить домножение только на те матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt;, у которых &amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&amp;lt;!-- Одним из способов приведения матрицы к форме Хессенберга является преобразование Хаусхолдера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Householder_transformation#Tridiagonalization%7C Wikipedia: Householder transformation]&amp;lt;/ref&amp;gt;. Данный алгоритм состоит из &amp;lt;math&amp;gt;n-1&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;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\alpha=-sgn(a_{k+1,k}^{(k)})\sqrt{\sum_{j=k+1}^{n}(a_{j,k}^{(k)})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;r=\sqrt{\frac{1}{2}(\alpha^2-a_{k+1,k}^{(k)}\alpha )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;v^{(k)}=\begin{bmatrix}v_1\\ v_2\\ \vdots \\ v_n\end{bmatrix}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{1}^{(k)}=v_{2}^{(k)}=...=v_{k}^{(k)}=0, v_{k+1}^{(k)}=\frac{a_{k+1,k}^{(k)}-\alpha}{2r}&amp;lt;/math&amp;gt;, а остальные элементы &amp;lt;math&amp;gt;v_{j}^{(k)}=\frac{a_{jk}^{(k)}}{2r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;P^{(k)}=E-2v^{(k)}(v^{(k)})^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;A^{(k+1)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^{(k+1)}=P^{(k)}A^{(k)}(P^{(k)})^T&amp;lt;/math&amp;gt;. Важно отметить, что форма, которой обладают матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;, позволяет свести данную операцию перемножения матриц к менее затратным операциям перемножения матрицы на вектор. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одним из способов приведения матрицы к форме Хессенберга является Метод Хаусхолдера (отражений)&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;lt;/ref&amp;gt;. Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга при помощи домножения ее на так называемые матрицы отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&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;E-\frac{1}{\gamma }ww^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
В основной статье &amp;quot;[[Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (почти треугольной) форме]]&amp;quot; данный алгоритм описан более подробно с той лишь разницей, что для QR-алгоритма нет необходимости обнулять наддиагональные элементы, как это сделано в вышеупомянутой статье.&lt;br /&gt;
&lt;br /&gt;
==== QR-алгоритм со сдвигами ====&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами позволяет сократить количество итераций, необходимых для сходимости&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;&amp;gt;Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численный методы&amp;quot;— 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&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;
&lt;br /&gt;
* На каждом шаге подбирается число &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; и ищется следующее QR-разложение: &amp;lt;math&amp;gt;A_k-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычисляется матрица &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE&amp;lt;/math&amp;gt;.&lt;br /&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;
&amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE=Q_{k}^{T}Q_kR_kQ_k+\nu_kE=Q_{k}^{T}(A_k-\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-Q_{k}^{T}(\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-\nu_kE+\nu_kE=Q_{k}^{T}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; может быть взят последний диагональный элемент матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--===== Подбор параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
//TODO--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&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_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]: вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]: вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&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-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt; при помощи модифицированного метода Гивенса (вращений). Описание вычислительного ядра не отличается от приведенного в описании базового алгоритма, единственная разница заключается в значительно меньшем количестве матриц вращения.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}-\nu_kE=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае модифицированного QR-алгоритма появляется еще макрооперация приведения матрицы к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет совершаться сдвиг и вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 nu - параметр сдвига&lt;br /&gt;
 shiftA - текущая матрица со сдвигом.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     nu = computeNu(curA)&lt;br /&gt;
     shiftA = curA - nu*E&lt;br /&gt;
     findQRdecomposition(shiftA,Q,R)&lt;br /&gt;
     nextA = R*Q + nu*E&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
&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;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит заметить, что вычисление сдвигов по сравнению с другими операциями не обладает высокой сложностью, однако позволяет значительно сократить количество необходимых итераций.&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Сложность всего алгоритма, с учетом приведения матрицы к форме Хессенберга, будет равна &amp;lt;math&amp;gt;O(n^3)+N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
На рисунках 1 и 2 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
* &#039;&#039;&#039;Iter&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - итерация алгоритма&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Base_All.png|center|frame|Рисунок 1. Информационный граф базового QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Base_Iter.png|center|frame|Рисунок 2. Информационный граф итерации базового QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; (рис.3) и &#039;&#039;&#039;Dif&#039;&#039;&#039; (рис.4) на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 4. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На рисунках 5 и 6 изображен информационный граф модифицированного QR-алгоритма. Дополнительные вершины для этого графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;Shift&#039;&#039;&#039; - операция сдвига&lt;br /&gt;
* &#039;&#039;&#039;H&#039;&#039;&#039; - операция приведения матрицы к форме Хессенберга&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Mod_All.png|center|frame|Рисунок 5. Информационный граф модифицированного QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Mod_Iter.png|center|frame|Рисунок 6. Информационный граф итерации модифицированного QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Отличия от базового алгоритма заключаются в следующем:&lt;br /&gt;
# Приведение матрицы к форме Хессенберга имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# QR-разложение матрицы модифицированным методом Гивенса (вращений) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Операция сдвига (вычитание из диагональных элементов матрицы одного числа) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, итоговые характеристики всего модифицированного алгоритма будут следующие: высота ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)+N*O(n)&amp;lt;/math&amp;gt; и ширина ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
Масштабируемость алгоритма (рис.7) исследовалась на основе реализации алгоритма в библиотеке [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]. Время работы было замерено для различных размеров матрицы, а также различного числа процессоров. &lt;br /&gt;
&lt;br /&gt;
[[Файл:QRPerfomance.png|center|frame|Рисунок 7. Масштабируемость QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
При увеличении числа процессоров время работы программы увеличивается при малом размере матрицы, распараллеливание алгоритма неэффективно. Однако при больших размерах матрицы (более &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; 10^3\times10^3&amp;lt;/math&amp;gt;) время работы параллельной реализации значительно меньше последовательной.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/pool/File:QR-Kiyamova-Smirnova.docx Код программы]&lt;br /&gt;
&lt;br /&gt;
Все вычисления были проведены на суперкомпьютере [http://hpc.cs.msu.su/regatta Regatta]. Библиотека [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0] была установлена вручную.&lt;br /&gt;
Компиляция проводилась с использованием компилятора mpicxx с опциями -lscalapack и -llapack с указанием полного пути до используемых библиотек.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=18425</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=18425"/>
		<updated>2016-11-18T22:16:34Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: &lt;br /&gt;
*[[Участник:Смирнова_Александра|Смирнова А.С.]] - описание теоретической части&lt;br /&gt;
*[[Участник:Александра_Киямова|Киямова А.]] - описание программистской части&lt;br /&gt;
Содержательно все пункты обсуждались авторами вместе, и их вклад был равным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами. Это позволит уменьшить количество итераций алгоритма.&lt;br /&gt;
В дальнейшем, в данной статье под модифицированным алгоритмом будет пониматься алгоритм, использующий сдвиги и матрицу с формой Хессенберга. Под базовым алгоритмом будет пониматься алгоритм, не использующий данные приемы.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
==== Приведение матрицы к форме Хессенберга ====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&lt;br /&gt;
&lt;br /&gt;
Матрицей, имеющей форму Хессенберга, называется такая матрица, у которой все элементы, находящиеся ниже первой поддиагонали, равны нулю (&amp;lt;math&amp;gt;a_{ij}=0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i&amp;lt;j+1&amp;lt;/math&amp;gt;). Пример такой матрицы приведен ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 1&amp;amp;  2&amp;amp;  3&amp;amp; 4\\ &lt;br /&gt;
 2&amp;amp;  5&amp;amp;  6&amp;amp; 7\\ &lt;br /&gt;
 0&amp;amp;  3&amp;amp;  8&amp;amp; 9\\ &lt;br /&gt;
 0&amp;amp;  0&amp;amp;  4&amp;amp; 1&lt;br /&gt;
\end{bmatrix}&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_H&amp;lt;/math&amp;gt;, имеющей форму Хессенберга (в силу подобия данные матрицы будут иметь одинаковые собственные значения). Наличие нулевых элементов в данной матрице позволяет ускорить процесс QR-разложения, причем данное ускорение будет иметь место на каждой итерации алгоритма, т.к. матрица с формой Хессенберга инвариантна относительно QR-итерации. Ускорение можно получить за счет использования модифицированного метода Гивенса(вращений) QR-разложения, который из-за изначального наличия нулевых элементов будет состоять не из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов, а из &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; шагов (будет происходить домножение только на те матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt;, у которых &amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&amp;lt;!-- Одним из способов приведения матрицы к форме Хессенберга является преобразование Хаусхолдера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Householder_transformation#Tridiagonalization%7C Wikipedia: Householder transformation]&amp;lt;/ref&amp;gt;. Данный алгоритм состоит из &amp;lt;math&amp;gt;n-1&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;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\alpha=-sgn(a_{k+1,k}^{(k)})\sqrt{\sum_{j=k+1}^{n}(a_{j,k}^{(k)})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;r=\sqrt{\frac{1}{2}(\alpha^2-a_{k+1,k}^{(k)}\alpha )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;v^{(k)}=\begin{bmatrix}v_1\\ v_2\\ \vdots \\ v_n\end{bmatrix}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{1}^{(k)}=v_{2}^{(k)}=...=v_{k}^{(k)}=0, v_{k+1}^{(k)}=\frac{a_{k+1,k}^{(k)}-\alpha}{2r}&amp;lt;/math&amp;gt;, а остальные элементы &amp;lt;math&amp;gt;v_{j}^{(k)}=\frac{a_{jk}^{(k)}}{2r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;P^{(k)}=E-2v^{(k)}(v^{(k)})^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;A^{(k+1)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^{(k+1)}=P^{(k)}A^{(k)}(P^{(k)})^T&amp;lt;/math&amp;gt;. Важно отметить, что форма, которой обладают матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;, позволяет свести данную операцию перемножения матриц к менее затратным операциям перемножения матрицы на вектор. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одним из способов приведения матрицы к форме Хессенберга является Метод Хаусхолдера (отражений)&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;lt;/ref&amp;gt;. Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга при помощи домножения ее на так называемые матрицы отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&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;E-\frac{1}{\gamma }ww^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
В основной статье &amp;quot;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;quot; данный алгоритм описан более подробно с той лишь разницей, что для QR-алгоритма нет необходимости обнулять наддиагональные элементы, как это сделано в вышеупомянутой статье.&lt;br /&gt;
&lt;br /&gt;
==== QR-алгоритм со сдвигами ====&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами позволяет сократить количество итераций, необходимых для сходимости&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;&amp;gt;Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численный методы&amp;quot;— 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&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;
&lt;br /&gt;
* На каждом шаге подбирается число &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; и ищется следующее QR-разложение: &amp;lt;math&amp;gt;A_k-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычисляется матрица &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE&amp;lt;/math&amp;gt;.&lt;br /&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;
&amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE=Q_{k}^{T}Q_kR_kQ_k+\nu_kE=Q_{k}^{T}(A_k-\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-Q_{k}^{T}(\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-\nu_kE+\nu_kE=Q_{k}^{T}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; может быть взят последний диагональный элемент матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--===== Подбор параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
//TODO--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&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_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]: вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]: вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&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-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt; при помощи модифицированного метода Гивенса (вращений). Описание вычислительного ядра не отличается от приведенного в описании базового алгоритма, единственная разница заключается в значительно меньшем количестве матриц вращения.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}-\nu_kE=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае модифицированного QR-алгоритма появляется еще макрооперация приведения матрицы к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет совершаться сдвиг и вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 nu - параметр сдвига&lt;br /&gt;
 shiftA - текущая матрица со сдвигом.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     nu = computeNu(curA)&lt;br /&gt;
     shiftA = curA - nu*E&lt;br /&gt;
     findQRdecomposition(shiftA,Q,R)&lt;br /&gt;
     nextA = R*Q + nu*E&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
&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;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит заметить, что вычисление сдвигов по сравнению с другими операциями не обладает высокой сложностью, однако позволяет значительно сократить количество необходимых итераций.&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Сложность всего алгоритма, с учетом приведения матрицы к форме Хессенберга, будет равна &amp;lt;math&amp;gt;O(n^3)+N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
На рисунках 1 и 2 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
* &#039;&#039;&#039;Iter&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - итерация алгоритма&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Base_All.png|center|frame|Рисунок 1. Информационный граф базового QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Base_Iter.png|center|frame|Рисунок 2. Информационный граф итерации базового QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; (рис.3) и &#039;&#039;&#039;Dif&#039;&#039;&#039; (рис.4) на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 4. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На рисунках 5 и 6 изображен информационный граф модифицированного QR-алгоритма. Дополнительные вершины для этого графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;Shift&#039;&#039;&#039; - операция сдвига&lt;br /&gt;
* &#039;&#039;&#039;H&#039;&#039;&#039; - операция приведения матрицы к форме Хессенберга&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Mod_All.png|center|frame|Рисунок 5. Информационный граф модифицированного QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Mod_Iter.png|center|frame|Рисунок 6. Информационный граф итерации модифицированного QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Отличия от базового алгоритма заключаются в следующем:&lt;br /&gt;
# Приведение матрицы к форме Хессенберга имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# QR-разложение матрицы модифицированным методом Гивенса (вращений) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Операция сдвига (вычитание из диагональных элементов матрицы одного числа) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, итоговые характеристики всего модифицированного алгоритма будут следующие: высота ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)+N*O(n)&amp;lt;/math&amp;gt; и ширина ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
Масштабируемость алгоритма (рис.7) исследовалась на основе реализации алгоритма в библиотеке [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]. Время работы было замерено для различных размеров матрицы, а также различного числа процессоров. &lt;br /&gt;
&lt;br /&gt;
[[Файл:QRPerfomance.png|center|frame|Рисунок 7. Масштабируемость QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
При увеличении числа процессоров время работы программы увеличивается при малом размере матрицы, распараллеливание алгоритма неэффективно. Однако при больших размерах матрицы (более &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; 10^3\times10^3&amp;lt;/math&amp;gt;) время работы параллельной реализации значительно меньше последовательной.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/pool/File:QR-Kiyamova-Smirnova.docx Код программы]&lt;br /&gt;
&lt;br /&gt;
Все вычисления были проведены на суперкомпьютере [http://hpc.cs.msu.su/regatta Regatta]. Библиотека [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0] была установлена вручную.&lt;br /&gt;
Компиляция проводилась с использованием компилятора mpicxx с опциями -lscalapack и -llapack с указанием полного пути до используемых библиотек.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=18422</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=18422"/>
		<updated>2016-11-18T22:10:57Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: &lt;br /&gt;
*[[Участник:Смирнова_Александра|Смирнова А.С.]] - описание теоретической части&lt;br /&gt;
*[[Участник:Александра_Киямова|Киямова А.]] - описание программистской части&lt;br /&gt;
Содержательно все пункты обсуждались авторами вместе, и их вклад был равным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами. Это позволит уменьшить количество итераций алгоритма.&lt;br /&gt;
В дальнейшем, в данной статье под модифицированным алгоритмом будет пониматься алгоритм, использующий сдвиги и матрицу с формой Хессенберга. Под базовым алгоритмом будет пониматься алгоритм, не использующий данные приемы.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
==== Приведение матрицы к форме Хессенберга ====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&lt;br /&gt;
&lt;br /&gt;
Матрицей, имеющей форму Хессенберга, называется такая матрица, у которой все элементы, находящиеся ниже первой поддиагонали, равны нулю (&amp;lt;math&amp;gt;a_{ij}=0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i&amp;lt;j+1&amp;lt;/math&amp;gt;). Пример такой матрицы приведен ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 1&amp;amp;  2&amp;amp;  3&amp;amp; 4\\ &lt;br /&gt;
 2&amp;amp;  5&amp;amp;  6&amp;amp; 7\\ &lt;br /&gt;
 0&amp;amp;  3&amp;amp;  8&amp;amp; 9\\ &lt;br /&gt;
 0&amp;amp;  0&amp;amp;  4&amp;amp; 1&lt;br /&gt;
\end{bmatrix}&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_H&amp;lt;/math&amp;gt;, имеющей форму Хессенберга (в силу подобия данные матрицы будут иметь одинаковые собственные значения). Наличие нулевых элементов в данной матрице позволяет ускорить процесс QR-разложения, причем данное ускорение будет иметь место на каждой итерации алгоритма, т.к. матрица с формой Хессенберга инвариантна относительно QR-итерации. Ускорение можно получить за счет использования модифицированного метода Гивенса(вращений) QR-разложения, который из-за изначального наличия нулевых элементов будет состоять не из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов, а из &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; шагов (будет происходить домножение только на те матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt;, у которых &amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&amp;lt;!-- Одним из способов приведения матрицы к форме Хессенберга является преобразование Хаусхолдера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Householder_transformation#Tridiagonalization%7C Wikipedia: Householder transformation]&amp;lt;/ref&amp;gt;. Данный алгоритм состоит из &amp;lt;math&amp;gt;n-1&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;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\alpha=-sgn(a_{k+1,k}^{(k)})\sqrt{\sum_{j=k+1}^{n}(a_{j,k}^{(k)})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;r=\sqrt{\frac{1}{2}(\alpha^2-a_{k+1,k}^{(k)}\alpha )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;v^{(k)}=\begin{bmatrix}v_1\\ v_2\\ \vdots \\ v_n\end{bmatrix}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{1}^{(k)}=v_{2}^{(k)}=...=v_{k}^{(k)}=0, v_{k+1}^{(k)}=\frac{a_{k+1,k}^{(k)}-\alpha}{2r}&amp;lt;/math&amp;gt;, а остальные элементы &amp;lt;math&amp;gt;v_{j}^{(k)}=\frac{a_{jk}^{(k)}}{2r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;P^{(k)}=E-2v^{(k)}(v^{(k)})^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;A^{(k+1)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^{(k+1)}=P^{(k)}A^{(k)}(P^{(k)})^T&amp;lt;/math&amp;gt;. Важно отметить, что форма, которой обладают матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;, позволяет свести данную операцию перемножения матриц к менее затратным операциям перемножения матрицы на вектор. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одним из способов приведения матрицы к форме Хессенберга является Метод Хаусхолдера (отражений)&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;lt;/ref&amp;gt;. Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга при помощи домножения ее на так называемые матрицы отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&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;E-\frac{1}{\gamma }ww^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
В основной статье &amp;quot;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;quot; данный алгоритм описан более подробно с той лишь разницей, что для QR-алгоритма нет необходимости обнулять наддиагональные элементы, как это сделано в вышеупомянутой статье.&lt;br /&gt;
&lt;br /&gt;
==== QR-алгоритм со сдвигами ====&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами позволяет сократить количество итераций, необходимых для сходимости&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;&amp;gt;Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численный методы&amp;quot;— 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&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;
&lt;br /&gt;
* На каждом шаге подбирается число &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; и ищется следующее QR-разложение: &amp;lt;math&amp;gt;A_k-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычисляется матрица &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE&amp;lt;/math&amp;gt;.&lt;br /&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;
&amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE=Q_{k}^{T}Q_kR_kQ_k+\nu_kE=Q_{k}^{T}(A_k-\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-Q_{k}^{T}(\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-\nu_kE+\nu_kE=Q_{k}^{T}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; может быть взят последний диагональный элемент матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--===== Подбор параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
//TODO--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&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_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]: вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]: вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&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-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt; при помощи модифицированного метода Гивенса (вращений). Описание вычислительного ядра не отличается от приведенного в описании базового алгоритма, единственная разница заключается в значительно меньшем количестве матриц вращения.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}-\nu_kE=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае модифицированного QR-алгоритма появляется еще макрооперация приведения матрицы к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет совершаться сдвиг и вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 nu - параметр сдвига&lt;br /&gt;
 shiftA - текущая матрица со сдвигом.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     nu = computeNu(curA)&lt;br /&gt;
     shiftA = curA - nu*E&lt;br /&gt;
     findQRdecomposition(shiftA,Q,R)&lt;br /&gt;
     nextA = R*Q + nu*E&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
&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;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит заметить, что вычисление сдвигов по сравнению с другими операциями не обладает высокой сложностью, однако позволяет значительно сократить количество необходимых итераций.&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Сложность всего алгоритма, с учетом приведения матрицы к форме Хессенберга, будет равна &amp;lt;math&amp;gt;O(n^3)+N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
На рисунках 1 и 2 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
* &#039;&#039;&#039;Iter&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - итерация алгоритма&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Base_All.png|center|frame|Рисунок 1. Информационный граф базового QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Base_Iter.png|center|frame|Рисунок 2. Информационный граф итерации базового QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; (рис.3) и &#039;&#039;&#039;Dif&#039;&#039;&#039; (рис.4) на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 4. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На рисунках 5 и 6 изображен информационный граф модифицированного QR-алгоритма. Дополнительные вершины для этого графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;Shift&#039;&#039;&#039; - операция сдвига&lt;br /&gt;
* &#039;&#039;&#039;H&#039;&#039;&#039; - операция приведения матрицы к форме Хессенберга&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Mod_All.png|center|frame|Рисунок 5. Информационный граф модифицированного QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Mod_Iter.png|center|frame|Рисунок 6. Информационный граф итерации модифицированного QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Отличия от базового алгоритма заключаются в следующем:&lt;br /&gt;
# Приведение матрицы к форме Хессенберга имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# QR-разложение матрицы модифицированным методом Гивенса (вращений) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Операция сдвига (вычитание из диагональных элементов матрицы одного числа) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, итоговые характеристики всего модифицированного алгоритма будут следующие: высота ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)+N*O(n)&amp;lt;/math&amp;gt; и ширина ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
Масштабируемость алгоритма (рис.7) исследовалась на основе реализации алгоритма в библиотеке [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]. Время работы было замерено для различных размеров матрицы, а также различного числа процессоров. &lt;br /&gt;
&lt;br /&gt;
[[Файл:QRPerfomance.png|center|frame|Рисунок 7. Масштабируемость QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
При увеличении числа процессоров время работы программы увеличивается при малом размере матрицы, распараллеливание алгоритма неэффективно. Однако при больших размерах матрицы (более &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; 10^3\times10^3&amp;lt;/math&amp;gt;) время работы параллельной реализации значительно меньше последовательной.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/pool/File:QR-Kiyamova-Smirnova.docx Код программы]&lt;br /&gt;
&lt;br /&gt;
Все вычисления были проведены на суперкомпьютере [http://hpc.cs.msu.su/regatta Regatta]. Библиотека [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0] была установлена вручную.&lt;br /&gt;
Компиляция проводилась с использованием компилятора mpicxx с опциями -lscalapack и -llapack с указанием полного пути до используемых библиотек.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=18421</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=18421"/>
		<updated>2016-11-18T22:09:23Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: &lt;br /&gt;
*[[Участник:Смирнова_Александра|Смирнова А.С.]] - описание теоретической части&lt;br /&gt;
*[[Участник:Александра_Киямова|Киямова А.]] - описание программистской части&lt;br /&gt;
Содержательно все пункты обсуждались авторами вместе, и их вклад был равным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами. Это позволит уменьшить количество итераций алгоритма.&lt;br /&gt;
В дальнейшем, в данной статье под модифицированным алгоритмом будет пониматься алгоритм, использующий сдвиги и матрицу с формой Хессенберга. Под базовым алгоритмом будет пониматься алгоритм, не использующий данные приемы.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
==== Приведение матрицы к форме Хессенберга ====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&lt;br /&gt;
&lt;br /&gt;
Матрицей, имеющей форму Хессенберга, называется такая матрица, у которой все элементы, находящиеся ниже первой поддиагонали, равны нулю (&amp;lt;math&amp;gt;a_{ij}=0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i&amp;lt;j+1&amp;lt;/math&amp;gt;). Пример такой матрицы приведен ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 1&amp;amp;  2&amp;amp;  3&amp;amp; 4\\ &lt;br /&gt;
 2&amp;amp;  5&amp;amp;  6&amp;amp; 7\\ &lt;br /&gt;
 0&amp;amp;  3&amp;amp;  8&amp;amp; 9\\ &lt;br /&gt;
 0&amp;amp;  0&amp;amp;  4&amp;amp; 1&lt;br /&gt;
\end{bmatrix}&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_H&amp;lt;/math&amp;gt;, имеющей форму Хессенберга (в силу подобия данные матрицы будут иметь одинаковые собственные значения). Наличие нулевых элементов в данной матрице позволяет ускорить процесс QR-разложения, причем данное ускорение будет иметь место на каждой итерации алгоритма, т.к. матрица с формой Хессенберга инвариантна относительно QR-итерации. Ускорение можно получить за счет использования модифицированного метода Гивенса(вращений) QR-разложения, который из-за изначального наличия нулевых элементов будет состоять не из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов, а из &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; шагов (будет происходить домножение только на те матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt;, у которых &amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&amp;lt;!-- Одним из способов приведения матрицы к форме Хессенберга является преобразование Хаусхолдера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Householder_transformation#Tridiagonalization%7C Wikipedia: Householder transformation]&amp;lt;/ref&amp;gt;. Данный алгоритм состоит из &amp;lt;math&amp;gt;n-1&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;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\alpha=-sgn(a_{k+1,k}^{(k)})\sqrt{\sum_{j=k+1}^{n}(a_{j,k}^{(k)})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;r=\sqrt{\frac{1}{2}(\alpha^2-a_{k+1,k}^{(k)}\alpha )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;v^{(k)}=\begin{bmatrix}v_1\\ v_2\\ \vdots \\ v_n\end{bmatrix}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{1}^{(k)}=v_{2}^{(k)}=...=v_{k}^{(k)}=0, v_{k+1}^{(k)}=\frac{a_{k+1,k}^{(k)}-\alpha}{2r}&amp;lt;/math&amp;gt;, а остальные элементы &amp;lt;math&amp;gt;v_{j}^{(k)}=\frac{a_{jk}^{(k)}}{2r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;P^{(k)}=E-2v^{(k)}(v^{(k)})^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;A^{(k+1)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^{(k+1)}=P^{(k)}A^{(k)}(P^{(k)})^T&amp;lt;/math&amp;gt;. Важно отметить, что форма, которой обладают матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;, позволяет свести данную операцию перемножения матриц к менее затратным операциям перемножения матрицы на вектор. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одним из способов приведения матрицы к форме Хессенберга является Метод Хаусхолдера (отражений)&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;lt;/ref&amp;gt;. Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга при помощи домножения ее на так называемые матрицы отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&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;E-\frac{1}{\gamma }ww^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
В основной статье &amp;quot;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;quot; данный алгоритм описан более подробно с той лишь разницей, что для QR-алгоритма нет необходимости обнулять наддиагональные элементы, как это сделано в вышеупомянутой статье.&lt;br /&gt;
&lt;br /&gt;
==== QR-алгоритм со сдвигами ====&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами позволяет сократить количество итераций, необходимых для сходимости&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;&amp;gt;Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численный методы&amp;quot;— 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&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;
&lt;br /&gt;
* На каждом шаге подбирается число &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; и ищется следующее QR-разложение: &amp;lt;math&amp;gt;A_k-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычисляется матрица &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE&amp;lt;/math&amp;gt;.&lt;br /&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;
&amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE=Q_{k}^{T}Q_kR_kQ_k+\nu_kE=Q_{k}^{T}(A_k-\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-Q_{k}^{T}(\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-\nu_kE+\nu_kE=Q_{k}^{T}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; может быть взят последний диагональный элемент матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--===== Подбор параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
//TODO--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&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_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]: вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]: вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&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-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt; при помощи модифицированного метода Гивенса (вращений). Описание вычислительного ядра не отличается от приведенного в описании базового алгоритма, единственная разница заключается в значительно меньшем количестве матриц вращения.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}-\nu_kE=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае модифицированного QR-алгоритма появляется еще макрооперация приведения матрицы к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет совершаться сдвиг и вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 nu - параметр сдвига&lt;br /&gt;
 shiftA - текущая матрица со сдвигом.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     nu = computeNu(curA)&lt;br /&gt;
     shiftA = curA - nu*E&lt;br /&gt;
     findQRdecomposition(shiftA,Q,R)&lt;br /&gt;
     nextA = R*Q + nu*E&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
&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;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит заметить, что вычисление сдвигов по сравнению с другими операциями не обладает высокой сложностью, однако позволяет значительно сократить количество необходимых итераций.&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Сложность всего алгоритма, с учетом приведения матрицы к форме Хессенберга, будет равна &amp;lt;math&amp;gt;O(n^3)+N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
На рисунках 1 и 2 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
* &#039;&#039;&#039;Iter&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - итерация алгоритма&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Base_All.png|center|frame|Рисунок 1. Информационный граф базового QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Base_Iter.png|center|frame|Рисунок 2. Информационный граф итерации базового QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; (рис.3) и &#039;&#039;&#039;Dif&#039;&#039;&#039; (рис.4) на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 4. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На рисунках 5 и 6 изображен информационный граф модифицированного QR-алгоритма. Дополнительные вершины для этого графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;Shift&#039;&#039;&#039; - операция сдвига&lt;br /&gt;
* &#039;&#039;&#039;H&#039;&#039;&#039; - операция приведения матрицы к форме Хессенберга&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Mod_All.png|center|frame|Рисунок 5. Информационный граф модифицированного QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Mod_Iter.png|center|frame|Рисунок 6. Информационный граф итерации модифицированного QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Отличия от базового алгоритма заключаются в следующем:&lt;br /&gt;
# Приведение матрицы к форме Хессенберга имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# QR-разложение матрицы модифицированным методом Гивенса (вращений) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Операция сдвига (вычитание из диагональных элементов матрицы одного числа) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, итоговые характеристики всего модифицированного алгоритма будут следующие: высота ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)+N*O(n)&amp;lt;/math&amp;gt; и ширина ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
Масштабируемость алгоритма (рис.7) исследовалась на основе реализации алгоритма в библиотеке [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0]: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]. Время работы было замерено для различных размеров матрицы, а также различного числа процессоров. &lt;br /&gt;
&lt;br /&gt;
[[Файл:QRPerfomance.png|center|frame|Рисунок 7. Масштабируемость QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
При увеличении числа процессоров время работы программы увеличивается при малом размере матрицы, распараллеливание алгоритма неэффективно. Однако при больших размерах матрицы (более &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; 10^3\times10^3&amp;lt;/math&amp;gt;) время работы параллельной реализации значительно меньше последовательной.&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/pool/File:QR-Kiyamova-Smirnova.docx Код программы]&lt;br /&gt;
&lt;br /&gt;
Все вычисления были проведены на суперкомпьютере [http://hpc.cs.msu.su/regatta Regatta]. Библиотека [http://www.netlib.org/scalapack/#_scalapack_version_2_0_0 ScaLAPACK v2.0.0] была установлена вручную.&lt;br /&gt;
Компиляция проводилась с использованием компилятора mpicxx с опциями -lscalapack и -llapack.&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=18410</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=18410"/>
		<updated>2016-11-18T21:43:51Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: &lt;br /&gt;
*[[Участник:Смирнова_Александра|Смирнова А.С.]] - описание теоретической части&lt;br /&gt;
*[[Участник:Александра_Киямова|Киямова А.]] - описание программистской части&lt;br /&gt;
Содержательно все пункты обсуждались авторами вместе, и их вклад был равным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами. Это позволит уменьшить количество итераций алгоритма.&lt;br /&gt;
В дальнейшем, в данной статье под модифицированным алгоритмом будет пониматься алгоритм, использующий сдвиги и матрицу с формой Хессенберга. Под базовым алгоритмом будет пониматься алгоритм, не использующий данные приемы.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
==== Приведение матрицы к форме Хессенберга ====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&lt;br /&gt;
&lt;br /&gt;
Матрицей, имеющей форму Хессенберга, называется такая матрица, у которой все элементы, находящиеся ниже первой поддиагонали, равны нулю (&amp;lt;math&amp;gt;a_{ij}=0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i&amp;lt;j+1&amp;lt;/math&amp;gt;). Пример такой матрицы приведен ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 1&amp;amp;  2&amp;amp;  3&amp;amp; 4\\ &lt;br /&gt;
 2&amp;amp;  5&amp;amp;  6&amp;amp; 7\\ &lt;br /&gt;
 0&amp;amp;  3&amp;amp;  8&amp;amp; 9\\ &lt;br /&gt;
 0&amp;amp;  0&amp;amp;  4&amp;amp; 1&lt;br /&gt;
\end{bmatrix}&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_H&amp;lt;/math&amp;gt;, имеющей форму Хессенберга (в силу подобия данные матрицы будут иметь одинаковые собственные значения). Наличие нулевых элементов в данной матрице позволяет ускорить процесс QR-разложения, причем данное ускорение будет иметь место на каждой итерации алгоритма, т.к. матрица с формой Хессенберга инвариантна относительно QR-итерации. Ускорение можно получить за счет использования модифицированного метода Гивенса(вращений) QR-разложения, который из-за изначального наличия нулевых элементов будет состоять не из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов, а из &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; шагов (будет происходить домножение только на те матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt;, у которых &amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&amp;lt;!-- Одним из способов приведения матрицы к форме Хессенберга является преобразование Хаусхолдера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Householder_transformation#Tridiagonalization%7C Wikipedia: Householder transformation]&amp;lt;/ref&amp;gt;. Данный алгоритм состоит из &amp;lt;math&amp;gt;n-1&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;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\alpha=-sgn(a_{k+1,k}^{(k)})\sqrt{\sum_{j=k+1}^{n}(a_{j,k}^{(k)})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;r=\sqrt{\frac{1}{2}(\alpha^2-a_{k+1,k}^{(k)}\alpha )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;v^{(k)}=\begin{bmatrix}v_1\\ v_2\\ \vdots \\ v_n\end{bmatrix}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{1}^{(k)}=v_{2}^{(k)}=...=v_{k}^{(k)}=0, v_{k+1}^{(k)}=\frac{a_{k+1,k}^{(k)}-\alpha}{2r}&amp;lt;/math&amp;gt;, а остальные элементы &amp;lt;math&amp;gt;v_{j}^{(k)}=\frac{a_{jk}^{(k)}}{2r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;P^{(k)}=E-2v^{(k)}(v^{(k)})^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;A^{(k+1)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^{(k+1)}=P^{(k)}A^{(k)}(P^{(k)})^T&amp;lt;/math&amp;gt;. Важно отметить, что форма, которой обладают матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;, позволяет свести данную операцию перемножения матриц к менее затратным операциям перемножения матрицы на вектор. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одним из способов приведения матрицы к форме Хессенберга является Метод Хаусхолдера (отражений)&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;lt;/ref&amp;gt;. Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга при помощи домножения ее на так называемые матрицы отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&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;E-\frac{1}{\gamma }ww^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
В основной статье &amp;quot;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;quot; данный алгоритм описан более подробно с той лишь разницей, что для QR-алгоритма нет необходимости обнулять наддиагональные элементы, как это сделано в вышеупомянутой статье.&lt;br /&gt;
&lt;br /&gt;
==== QR-алгоритм со сдвигами ====&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами позволяет сократить количество итераций, необходимых для сходимости&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;&amp;gt;Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численный методы&amp;quot;— 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&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;
&lt;br /&gt;
* На каждом шаге подбирается число &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; и ищется следующее QR-разложение: &amp;lt;math&amp;gt;A_k-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычисляется матрица &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE&amp;lt;/math&amp;gt;.&lt;br /&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;
&amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE=Q_{k}^{T}Q_kR_kQ_k+\nu_kE=Q_{k}^{T}(A_k-\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-Q_{k}^{T}(\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-\nu_kE+\nu_kE=Q_{k}^{T}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; может быть взят последний диагональный элемент матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--===== Подбор параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
//TODO--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&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_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]: вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]: вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&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-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt; при помощи модифицированного метода Гивенса (вращений). Описание вычислительного ядра не отличается от приведенного в описании базового алгоритма, единственная разница заключается в значительно меньшем количестве матриц вращения.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}-\nu_kE=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае модифицированного QR-алгоритма появляется еще макрооперация приведения матрицы к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет совершаться сдвиг и вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 nu - параметр сдвига&lt;br /&gt;
 shiftA - текущая матрица со сдвигом.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     nu = computeNu(curA)&lt;br /&gt;
     shiftA = curA - nu*E&lt;br /&gt;
     findQRdecomposition(shiftA,Q,R)&lt;br /&gt;
     nextA = R*Q + nu*E&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
&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;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит заметить, что вычисление сдвигов по сравнению с другими операциями не обладает высокой сложностью, однако позволяет значительно сократить количество необходимых итераций.&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Сложность всего алгоритма, с учетом приведения матрицы к форме Хессенберга, будет равна &amp;lt;math&amp;gt;O(n^3)+N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
На рисунках 1 и 2 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
* &#039;&#039;&#039;Iter&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - итерация алгоритма&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Base_All.png|center|frame|Рисунок 1. Информационный граф базового QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Base_Iter.png|center|frame|Рисунок 2. Информационный граф итерации базового QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; (рис.3) и &#039;&#039;&#039;Dif&#039;&#039;&#039; (рис.4) на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 4. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На рисунках 5 и 6 изображен информационный граф модифицированного QR-алгоритма. Дополнительные вершины для этого графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;Shift&#039;&#039;&#039; - операция сдвига&lt;br /&gt;
* &#039;&#039;&#039;H&#039;&#039;&#039; - операция приведения матрицы к форме Хессенберга&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Mod_All.png|center|frame|Рисунок 5. Информационный граф модифицированного QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Mod_Iter.png|center|frame|Рисунок 6. Информационный граф итерации модифицированного QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Отличия от базового алгоритма заключаются в следующем:&lt;br /&gt;
# Приведение матрицы к форме Хессенберга имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# QR-разложение матрицы модифицированным методом Гивенса (вращений) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Операция сдвига (вычитание из диагональных элементов матрицы одного числа) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, итоговые характеристики всего модифицированного алгоритма будут следующие: высота ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)+N*O(n)&amp;lt;/math&amp;gt; и ширина ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
Масштабируемость алгоритма (рис.7) исследовалась на основе реализации алгоритма в библиотеке ScaLAPACK: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]. Время работы было замерено для различных размеров матрицы, а также различного числа процессоров. Все вычисления были проведены на суперкомпьютере [http://hpc.cs.msu.su/regatta Regatta].&lt;br /&gt;
&lt;br /&gt;
[[Файл:QRPerfomance.png|center|frame|Рисунок 7. Масштабируемость QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
[https://algowiki-project.org/pool/File:QR-Kiyamova-Smirnova.docx Код программы]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=18389</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=18389"/>
		<updated>2016-11-18T21:15:11Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: &lt;br /&gt;
*[[Участник:Смирнова_Александра|Смирнова А.С.]] - описание теоретической части&lt;br /&gt;
*[[Участник:Александра_Киямова|Киямова А.]] - описание программистской части&lt;br /&gt;
Содержательно все пункты обсуждались авторами вместе, и их вклад был равным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами. Это позволит уменьшить количество итераций алгоритма.&lt;br /&gt;
В дальнейшем, в данной статье под модифицированным алгоритмом будет пониматься алгоритм, использующий сдвиги и матрицу с формой Хессенберга. Под базовым алгоритмом будет пониматься алгоритм, не использующий данные приемы.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
==== Приведение матрицы к форме Хессенберга ====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&lt;br /&gt;
&lt;br /&gt;
Матрицей, имеющей форму Хессенберга, называется такая матрица, у которой все элементы, находящиеся ниже первой поддиагонали, равны нулю (&amp;lt;math&amp;gt;a_{ij}=0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i&amp;lt;j+1&amp;lt;/math&amp;gt;). Пример такой матрицы приведен ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 1&amp;amp;  2&amp;amp;  3&amp;amp; 4\\ &lt;br /&gt;
 2&amp;amp;  5&amp;amp;  6&amp;amp; 7\\ &lt;br /&gt;
 0&amp;amp;  3&amp;amp;  8&amp;amp; 9\\ &lt;br /&gt;
 0&amp;amp;  0&amp;amp;  4&amp;amp; 1&lt;br /&gt;
\end{bmatrix}&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_H&amp;lt;/math&amp;gt;, имеющей форму Хессенберга (в силу подобия данные матрицы будут иметь одинаковые собственные значения). Наличие нулевых элементов в данной матрице позволяет ускорить процесс QR-разложения, причем данное ускорение будет иметь место на каждой итерации алгоритма, т.к. матрица с формой Хессенберга инвариантна относительно QR-итерации. Ускорение можно получить за счет использования модифицированного метода Гивенса(вращений) QR-разложения, который из-за изначального наличия нулевых элементов будет состоять не из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов, а из &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; шагов (будет происходить домножение только на те матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt;, у которых &amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&amp;lt;!-- Одним из способов приведения матрицы к форме Хессенберга является преобразование Хаусхолдера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Householder_transformation#Tridiagonalization%7C Wikipedia: Householder transformation]&amp;lt;/ref&amp;gt;. Данный алгоритм состоит из &amp;lt;math&amp;gt;n-1&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;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\alpha=-sgn(a_{k+1,k}^{(k)})\sqrt{\sum_{j=k+1}^{n}(a_{j,k}^{(k)})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;r=\sqrt{\frac{1}{2}(\alpha^2-a_{k+1,k}^{(k)}\alpha )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;v^{(k)}=\begin{bmatrix}v_1\\ v_2\\ \vdots \\ v_n\end{bmatrix}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{1}^{(k)}=v_{2}^{(k)}=...=v_{k}^{(k)}=0, v_{k+1}^{(k)}=\frac{a_{k+1,k}^{(k)}-\alpha}{2r}&amp;lt;/math&amp;gt;, а остальные элементы &amp;lt;math&amp;gt;v_{j}^{(k)}=\frac{a_{jk}^{(k)}}{2r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;P^{(k)}=E-2v^{(k)}(v^{(k)})^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;A^{(k+1)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^{(k+1)}=P^{(k)}A^{(k)}(P^{(k)})^T&amp;lt;/math&amp;gt;. Важно отметить, что форма, которой обладают матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;, позволяет свести данную операцию перемножения матриц к менее затратным операциям перемножения матрицы на вектор. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одним из способов приведения матрицы к форме Хессенберга является Метод Хаусхолдера (отражений)&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;lt;/ref&amp;gt;. Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга при помощи домножения ее на так называемые матрицы отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&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;E-\frac{1}{\gamma }ww^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
В основной статье &amp;quot;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;quot; данный алгоритм описан более подробно с той лишь разницей, что для QR-алгоритма нет необходимости обнулять наддиагональные элементы, как это сделано в вышеупомянутой статье.&lt;br /&gt;
&lt;br /&gt;
==== QR-алгоритм со сдвигами ====&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами позволяет сократить количество итераций, необходимых для сходимости&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;&amp;gt;Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численный методы&amp;quot;— 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&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;
&lt;br /&gt;
* На каждом шаге подбирается число &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; и ищется следующее QR-разложение: &amp;lt;math&amp;gt;A_k-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычисляется матрица &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE&amp;lt;/math&amp;gt;.&lt;br /&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;
&amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE=Q_{k}^{T}Q_kR_kQ_k+\nu_kE=Q_{k}^{T}(A_k-\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-Q_{k}^{T}(\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-\nu_kE+\nu_kE=Q_{k}^{T}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; может быть взят последний диагональный элемент матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--===== Подбор параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
//TODO--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&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_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]: вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]: вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&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-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt; при помощи модифицированного метода Гивенса (вращений). Описание вычислительного ядра не отличается от приведенного в описании базового алгоритма, единственная разница заключается в значительно меньшем количестве матриц вращения.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}-\nu_kE=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае модифицированного QR-алгоритма появляется еще макрооперация приведения матрицы к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет совершаться сдвиг и вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 nu - параметр сдвига&lt;br /&gt;
 shiftA - текущая матрица со сдвигом.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     nu = computeNu(curA)&lt;br /&gt;
     shiftA = curA - nu*E&lt;br /&gt;
     findQRdecomposition(shiftA,Q,R)&lt;br /&gt;
     nextA = R*Q + nu*E&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
&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;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит заметить, что вычисление сдвигов по сравнению с другими операциями не обладает высокой сложностью, однако позволяет значительно сократить количество необходимых итераций.&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Сложность всего алгоритма, с учетом приведения матрицы к форме Хессенберга, будет равна &amp;lt;math&amp;gt;O(n^3)+N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
На рисунках 1 и 2 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
* &#039;&#039;&#039;Iter&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - итерация алгоритма&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Base_All.png|center|frame|Рисунок 1. Информационный граф базового QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Base_Iter.png|center|frame|Рисунок 2. Информационный граф итерации базового QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; (рис.3) и &#039;&#039;&#039;Dif&#039;&#039;&#039; (рис.4) на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 4. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На рисунках 5 и 6 изображен информационный граф модифицированного QR-алгоритма. Дополнительные вершины для этого графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;Shift&#039;&#039;&#039; - операция сдвига&lt;br /&gt;
* &#039;&#039;&#039;H&#039;&#039;&#039; - операция приведения матрицы к форме Хессенберга&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Mod_All.png|center|frame|Рисунок 5. Информационный граф модифицированного QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Mod_Iter.png|center|frame|Рисунок 6. Информационный граф итерации модифицированного QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Отличия от базового алгоритма заключаются в следующем:&lt;br /&gt;
# Приведение матрицы к форме Хессенберга имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# QR-разложение матрицы модифицированным методом Гивенса (вращений) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Операция сдвига (вычитание из диагональных элементов матрицы одного числа) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, итоговые характеристики всего модифицированного алгоритма будут следующие: высота ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)+N*O(n)&amp;lt;/math&amp;gt; и ширина ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
Масштабируемость алгоритма (рис.7) исследовалась на основе реализации алгоритма в библиотеке ScaLAPACK: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]. Время работы было замерено для различных размеров матрицы, а также различного числа процессоров. Все вычисления были проведены на суперкомпьютере [http://hpc.cs.msu.su/regatta Regatta].&lt;br /&gt;
&lt;br /&gt;
[[Файл:QRPerfomance.png|center|frame|Рисунок 7. Масштабируемость QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=18387</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=18387"/>
		<updated>2016-11-18T21:14:20Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Масштабируемость алгоритма и его реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: &lt;br /&gt;
*[[Участник:Смирнова_Александра|Смирнова А.С.]] - описание теоретической части&lt;br /&gt;
*[[Участник:Александра_Киямова|Киямова А.]] - описание программистской части&lt;br /&gt;
Содержательно все пункты обсуждались авторами вместе, и их вклад был равным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами. Это позволит уменьшить количество итераций алгоритма.&lt;br /&gt;
В дальнейшем, в данной статье под модифицированным алгоритмом будет пониматься алгоритм, использующий сдвиги и матрицу с формой Хессенберга. Под базовым алгоритмом будет пониматься алгоритм, не использующий данные приемы.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
==== Приведение матрицы к форме Хессенберга ====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&lt;br /&gt;
&lt;br /&gt;
Матрицей, имеющей форму Хессенберга, называется такая матрица, у которой все элементы, находящиеся ниже первой поддиагонали, равны нулю (&amp;lt;math&amp;gt;a_{ij}=0&amp;lt;/math&amp;gt; при &amp;lt;math&amp;gt;i&amp;lt;j+1&amp;lt;/math&amp;gt;). Пример такой матрицы приведен ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{bmatrix}&lt;br /&gt;
 1&amp;amp;  2&amp;amp;  3&amp;amp; 4\\ &lt;br /&gt;
 2&amp;amp;  5&amp;amp;  6&amp;amp; 7\\ &lt;br /&gt;
 0&amp;amp;  3&amp;amp;  8&amp;amp; 9\\ &lt;br /&gt;
 0&amp;amp;  0&amp;amp;  4&amp;amp; 1&lt;br /&gt;
\end{bmatrix}&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_H&amp;lt;/math&amp;gt;, имеющей форму Хессенберга (в силу подобия данные матрицы будут иметь одинаковые собственные значения). Наличие нулевых элементов в данной матрице позволяет ускорить процесс QR-разложения, причем данное ускорение будет иметь место на каждой итерации алгоритма, т.к. матрица с формой Хессенберга инвариантна относительно QR-итерации. Ускорение можно получить за счет использования модифицированного метода Гивенса(вращений) QR-разложения, который из-за изначального наличия нулевых элементов будет состоять не из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов, а из &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt; шагов (будет происходить домножение только на те матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt;, у которых &amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&amp;lt;!-- Одним из способов приведения матрицы к форме Хессенберга является преобразование Хаусхолдера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Householder_transformation#Tridiagonalization%7C Wikipedia: Householder transformation]&amp;lt;/ref&amp;gt;. Данный алгоритм состоит из &amp;lt;math&amp;gt;n-1&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;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;\alpha&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;\alpha=-sgn(a_{k+1,k}^{(k)})\sqrt{\sum_{j=k+1}^{n}(a_{j,k}^{(k)})^2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;r=\sqrt{\frac{1}{2}(\alpha^2-a_{k+1,k}^{(k)}\alpha )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление вектора &amp;lt;math&amp;gt;v^{(k)}=\begin{bmatrix}v_1\\ v_2\\ \vdots \\ v_n\end{bmatrix}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;v_{1}^{(k)}=v_{2}^{(k)}=...=v_{k}^{(k)}=0, v_{k+1}^{(k)}=\frac{a_{k+1,k}^{(k)}-\alpha}{2r}&amp;lt;/math&amp;gt;, а остальные элементы &amp;lt;math&amp;gt;v_{j}^{(k)}=\frac{a_{jk}^{(k)}}{2r}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;P^{(k)}=E-2v^{(k)}(v^{(k)})^T&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Вычисление матрицы &amp;lt;math&amp;gt;A^{(k+1)}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A^{(k+1)}=P^{(k)}A^{(k)}(P^{(k)})^T&amp;lt;/math&amp;gt;. Важно отметить, что форма, которой обладают матрицы &amp;lt;math&amp;gt;P^{(k)}&amp;lt;/math&amp;gt;, позволяет свести данную операцию перемножения матриц к менее затратным операциям перемножения матрицы на вектор. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Одним из способов приведения матрицы к форме Хессенберга является Метод Хаусхолдера (отражений)&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;lt;/ref&amp;gt;. Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к форме Хессенберга при помощи домножения ее на так называемые матрицы отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&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;E-\frac{1}{\gamma }ww^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;w&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
В основной статье &amp;quot;[[Метод_Хаусхолдера_(отражений)_приведения_матрицы_к_хессенберговой_(двухдиагональной)_форме|Метод Хаусхолдера (отражений) приведения матрицы к хессенберговой (двухдиагональной) форме]]&amp;quot; данный алгоритм описан более подробно с той лишь разницей, что для QR-алгоритма нет необходимости обнулять наддиагональные элементы, как это сделано в вышеупомянутой статье.&lt;br /&gt;
&lt;br /&gt;
==== QR-алгоритм со сдвигами ====&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм со сдвигами позволяет сократить количество итераций, необходимых для сходимости&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;&amp;gt;Бахвалов Н.С., Жидков Н.П., Кобельков. Г.М. &amp;quot;Численный методы&amp;quot;— 6-е изд. — М. : БИНОМ. Лаборатория знаний, 2008. — 636 с.&amp;lt;/ref&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;
&lt;br /&gt;
* На каждом шаге подбирается число &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; и ищется следующее QR-разложение: &amp;lt;math&amp;gt;A_k-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
* Вычисляется матрица &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE&amp;lt;/math&amp;gt;.&lt;br /&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;
&amp;lt;math&amp;gt;A_{k+1} = R_kQ_k+\nu_kE=Q_{k}^{T}Q_kR_kQ_k+\nu_kE=Q_{k}^{T}(A_k-\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-Q_{k}^{T}(\nu_kE)Q_k+\nu_kE=Q_{k}^{T}A_kQ_k-\nu_kE+\nu_kE=Q_{k}^{T}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В качестве параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt; может быть взят последний диагональный элемент матрицы &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;!--===== Подбор параметра &amp;lt;math&amp;gt;\nu_k&amp;lt;/math&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
//TODO--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&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_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]: вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]: вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
#[[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&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-\nu_kE=Q_kR_k&amp;lt;/math&amp;gt; при помощи модифицированного метода Гивенса (вращений). Описание вычислительного ядра не отличается от приведенного в описании базового алгоритма, единственная разница заключается в значительно меньшем количестве матриц вращения.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}-\nu_kE=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&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_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
#Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В случае модифицированного QR-алгоритма появляется еще макрооперация приведения матрицы к форме Хессенберга.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет совершаться сдвиг и вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 nu - параметр сдвига&lt;br /&gt;
 shiftA - текущая матрица со сдвигом.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     nu = computeNu(curA)&lt;br /&gt;
     shiftA = curA - nu*E&lt;br /&gt;
     findQRdecomposition(shiftA,Q,R)&lt;br /&gt;
     nextA = R*Q + nu*E&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
&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;O(n^2)&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;bahvalov&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит заметить, что вычисление сдвигов по сравнению с другими операциями не обладает высокой сложностью, однако позволяет значительно сократить количество необходимых итераций.&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Сложность всего алгоритма, с учетом приведения матрицы к форме Хессенберга, будет равна &amp;lt;math&amp;gt;O(n^3)+N*O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
На рисунках 1 и 2 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
* &#039;&#039;&#039;Iter&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - итерация алгоритма&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Base_All.png|center|frame|Рисунок 1. Информационный граф базового QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Base_Iter.png|center|frame|Рисунок 2. Информационный граф итерации базового QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; (рис.3) и &#039;&#039;&#039;Dif&#039;&#039;&#039; (рис.4) на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 4. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На рисунках 5 и 6 изображен информационный граф модифицированного QR-алгоритма. Дополнительные вершины для этого графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;Shift&#039;&#039;&#039; - операция сдвига&lt;br /&gt;
* &#039;&#039;&#039;H&#039;&#039;&#039; - операция приведения матрицы к форме Хессенберга&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Mod_All.png|center|frame|Рисунок 5. Информационный граф модифицированного QR-алгоритма]]&lt;br /&gt;
[[Файл:QR_Alg_Mod_Iter.png|center|frame|Рисунок 6. Информационный граф итерации модифицированного QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
==== Базовый алгоритм ====&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
==== Модифицированный алгоритм ====&lt;br /&gt;
&lt;br /&gt;
Отличия от базового алгоритма заключаются в следующем:&lt;br /&gt;
# Приведение матрицы к форме Хессенберга имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# QR-разложение матрицы модифицированным методом Гивенса (вращений) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Операция сдвига (вычитание из диагональных элементов матрицы одного числа) имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, итоговые характеристики всего модифицированного алгоритма будут следующие: высота ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)+N*O(n)&amp;lt;/math&amp;gt; и ширина ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
Масштабируемость алгоритма (рис.7) исследовалась на основе реализации алгоритма в библиотеке ScaLAPACK: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]. Время работы было замерено для различных размеров матрицы, а также различного числа процессоров. Все вычисления были проведены на суперкомпьютере [http://hpc.cs.msu.su/regatta Regatta].&lt;br /&gt;
&lt;br /&gt;
[[Файл:algowiki-project.org/pool/File:QRPerfomance.png|center|frame|Рисунок 7. Масштабируемость QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13791</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13791"/>
		<updated>2016-10-25T16:40:04Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Рисунок 1. Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; (рис.2) и &#039;&#039;&#039;Dif&#039;&#039;&#039; (рис.3) на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 2. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13789</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13789"/>
		<updated>2016-10-25T16:30:33Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Рисунок 1. Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; (рис.2) и &#039;&#039;&#039;Dif&#039;&#039;&#039; (рис.3) на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 2. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13788</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13788"/>
		<updated>2016-10-25T16:29:47Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Рисунок 1. Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом (рис.2, рис.3).&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 2. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13787</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13787"/>
		<updated>2016-10-25T16:29:02Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке 1 изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Рисунок 1. Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 2. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13786</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13786"/>
		<updated>2016-10-25T16:28:37Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Рисунок 1. Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Рисунок 2. Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Рисунок 3. Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13782</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13782"/>
		<updated>2016-10-25T16:19:52Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Вещественный вариант QR-алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13781</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13781"/>
		<updated>2016-10-25T16:19:26Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13779</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13779"/>
		<updated>2016-10-25T16:18:06Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Параллельные реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm].&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm].&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13778</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13778"/>
		<updated>2016-10-25T16:17:00Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Последовательные реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr].&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf].&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm].&lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD].&lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц.&lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS].&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module].&lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module].&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=].&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13777</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13777"/>
		<updated>2016-10-25T16:15:34Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными).&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13776</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13776"/>
		<updated>2016-10-25T16:14:39Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам).&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на выходе из итерации.&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13775</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13775"/>
		<updated>2016-10-25T16:12:57Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Информационный граф */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы.&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц.&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму.&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13774</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13774"/>
		<updated>2016-10-25T16:12:10Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13772</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13772"/>
		<updated>2016-10-25T16:11:13Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам).&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы.&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;.&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13771</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13771"/>
		<updated>2016-10-25T16:10:23Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица.&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге.&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q.&lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13770</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13770"/>
		<updated>2016-10-25T16:09:29Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Макроструктура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13769</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13769"/>
		<updated>2016-10-25T16:09:00Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из операций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13768</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13768"/>
		<updated>2016-10-25T16:08:22Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Вещественный вариант QR-алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13767</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13767"/>
		<updated>2016-10-25T16:07:37Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Сходимость алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13766</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13766"/>
		<updated>2016-10-25T16:06:40Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* QR-алгоритм нахождения собственных чисел */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13765</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13765"/>
		<updated>2016-10-25T16:04:08Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* QR-разложение матрицы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица.&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13764</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13764"/>
		<updated>2016-10-25T16:03:01Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения.&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13763</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13763"/>
		<updated>2016-10-25T16:01:51Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13762</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13762"/>
		<updated>2016-10-25T16:00:49Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами &amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13760</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=13760"/>
		<updated>2016-10-25T15:58:35Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами &amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9473</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9473"/>
		<updated>2016-10-15T12:32:12Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Последовательная сложность алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами &amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9457</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9457"/>
		<updated>2016-10-15T12:28:55Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Метод Гивенса (вращений) QR-разложения квадратной матрицы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами &amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9456</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9456"/>
		<updated>2016-10-15T12:28:33Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Метод Гивенса (вращений) QR-разложения квадратной матрицы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами &amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:5%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9454</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9454"/>
		<updated>2016-10-15T12:28:08Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Метод Гивенса (вращений) QR-разложения квадратной матрицы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами &amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9444</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9444"/>
		<updated>2016-10-15T12:22:30Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами &amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9432</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9432"/>
		<updated>2016-10-15T12:17:35Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами &amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел матрицы. При этом алгоритм позволяет найти и собственные вектора матрицы. Он был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9384</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9384"/>
		<updated>2016-10-15T12:06:49Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами &amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и имеют одинаковый набор собственных значений.&lt;br /&gt;
&lt;br /&gt;
==== Сходимость алгоритма ====&lt;br /&gt;
Предположим, что для &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9379</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9379"/>
		<updated>2016-10-15T12:06:17Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* QR-разложение матрицы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами &amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма. &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы&amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &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;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9374</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9374"/>
		<updated>2016-10-15T12:04:02Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* QR-разложение матрицы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами &amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма. &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы. &amp;lt;ref&amp;gt;[[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref&amp;gt;[[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&amp;lt;/ref&amp;gt; Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&gt;
&lt;br /&gt;
На &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ом шаге задача &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-ой матрицы отражения заключается в обнулении всех поддиагональных элементов &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;n&amp;lt;/math&amp;gt; шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;E-\frac{1}{\gamma }vv^*&amp;lt;/math&amp;gt;, где вектор &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; вычисляется из текущего &amp;lt;math style=&amp;quot;vertical-align:0%&amp;quot;&amp;gt;i&amp;lt;/math&amp;gt;-го столбца матрицы при помощи использования операции скалярного произведения векторов. Данное представление матриц отражения позволяет хранить их в виде одного вектора и сводит домножение матрицы отражения на текущую матрицу к арифметическим операциям над векторами (скалярное произведение и сложение векторов).&lt;br /&gt;
&lt;br /&gt;
===== Метод Гивенса (вращений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &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;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9351</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9351"/>
		<updated>2016-10-15T11:54:21Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами &amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма. &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/QR_algorithm Wikipedia: QR-algorithm]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&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;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из n шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;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;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &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;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9343</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=9343"/>
		<updated>2016-10-15T11:52:30Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами &amp;lt;ref&amp;gt;Ильин В.А., Ким Г.Д. &amp;quot;Линейная алгебра и аналитическая геометрия&amp;quot;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&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;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из n шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;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;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &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;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=8314</id>
		<title>Участник:Смирнова Александра/Нахождение собственных чисел квадратной матрицы методом QR разложения (3)</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:%D0%A1%D0%BC%D0%B8%D1%80%D0%BD%D0%BE%D0%B2%D0%B0_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/%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_(3)&amp;diff=8314"/>
		<updated>2016-10-14T21:38:13Z</updated>

		<summary type="html">&lt;p&gt;Александра Киямова: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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*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;
Основные авторы описания: [[Участник:Смирнова_Александра|Смирнова А.С.]], [[Участник:Александра_Киямова|Киямова А.]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Задача нахождения собственных значений и собственных векторов для матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; заключается в поиске таких чисел &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt;, которые удовлетворяют уравнению:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Ax=\lambda x&amp;lt;/math&amp;gt;, при этом, числа &amp;lt;math&amp;gt;\lambda&amp;lt;/math&amp;gt; называются собственными значениями, а вектора &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; - собственными векторами&lt;br /&gt;
&lt;br /&gt;
Данная задача является одной из важнейших задач линейной алгебры. Собственные вектора и собственные значения применяются в различных областях науки: в аналитической геометрии, при решении систем интегральных уравнений, в математической физике. Однако не существует простых алгоритмов прямого вычисления собственных значений для матриц в общем случае, поэтому данная задача на практике решается численными методами. Одним из таких методов является QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Свойства и структура алгоритма ==&lt;br /&gt;
&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм — это численный метод в линейной алгебре, предназначенный для решения полной проблемы собственных значений, то есть отыскания всех собственных чисел и собственных векторов матрицы. Был разработан в конце 1950-х годов независимо В. Н. Кублановской(Россия) и Дж. Фрэнсисом(Англия). Открытию QR-алгоритма предшествовал LR-алгоритм, который использовал LU-разложение вместо QR-разложения. В настоящее время LR-алгоритм используется очень редко ввиду своей меньшей эффективности, однако он был важным шагом на пути к открытию QR-алгоритма.&lt;br /&gt;
&lt;br /&gt;
Суть базового QR-алгоритма заключается в итерационном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к некоторой подобной ей матрице &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; при помощи QR-разложения. Матрица &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; является правой верхней треугольной матрицей, а значит ее диагональ содержит собственные значения. В силу подобия матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; их наборы собственных значений совпадают. Таким образом задача поиска собственных значений матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; сводится к задаче выведения матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;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_H&amp;lt;/math&amp;gt;, которая будет иметь форму Хессенберга. Данный шаг позволит ускорить процесс QR-разложения&lt;br /&gt;
* Использовать QR-алгоритм со сдвигами&lt;br /&gt;
&lt;br /&gt;
В данной статье будет рассмотрен только базовый QR-алгоритм.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== QR-разложение матрицы ====&lt;br /&gt;
&lt;br /&gt;
Основой алгоритма является тот факт, что любую вещественную матрицу можно разложить на произведение двух матриц следующего вида:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;A=QR&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; - ортогональная матрица (&amp;lt;math&amp;gt;Q^T=Q^{-1}&amp;lt;/math&amp;gt;), &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt; - верхняя треугольная матрица&lt;br /&gt;
&lt;br /&gt;
Данное разложение называется QR-разложением.&lt;br /&gt;
&lt;br /&gt;
Есть несколько алгоритмов вычисления QR-разложения матрицы. Кратко опишем их в данной статье.&lt;br /&gt;
&lt;br /&gt;
===== Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы =====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Хаусхолдера заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы отражения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц отражения.&lt;br /&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;i&amp;lt;/math&amp;gt;-го столбца матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (при этом столбцы левее &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-го не изменяются). Таким образом, алгоритм состоит из n шагов, на каждом из которых вычисляется очередная матрица отражения, после чего найденное отражение применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрица отражения имеет вид &amp;lt;math&amp;gt;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;
:&#039;&#039;Основная статья:&#039;&#039; [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений) QR-разложения квадратной матрицы]]&lt;br /&gt;
&lt;br /&gt;
Суть метода Гивенса заключается в последовательном приведении матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; к верхней треугольной форме при помощи домножения ее на так называемые матрицы вращения. Получившаяся треугольная матрица будет искомой матрицей &amp;lt;math&amp;gt;R&amp;lt;/math&amp;gt;, а матрица &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt; будет равна произведению сопряженных матриц вращения.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге задачей матрицы вращения является обнуление одного поддиагонального элемента. Вначале обнуляются все поддиагональные элементы 1-го столбца, затем 2-го и так далее до &amp;lt;math&amp;gt;(n-1)&amp;lt;/math&amp;gt;-го. Таким образом, алгоритм состоит из &amp;lt;math&amp;gt;\frac{n(n-1)}{2}&amp;lt;/math&amp;gt; шагов на каждом из которых вычисляется очередная матрица вращения, после чего она применяется к матрице, которая является результатом предыдущего шага.&lt;br /&gt;
&lt;br /&gt;
Матрицы вращения &amp;lt;math&amp;gt;T_{ij}&amp;lt;/math&amp;gt; по ствоей структуре очень близки к единичным матрицам, за исключением четырех элементов: элементы с номерами &amp;lt;math&amp;gt;ii&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;jj&amp;lt;/math&amp;gt; содержат некоторое число-параметр &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt;, элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;ji&amp;lt;/math&amp;gt; содержат числа-параметры &amp;lt;math&amp;gt;-s&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; соответственно. Вычисление параметров &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; происходит на каждом шаге в зависимости от текущей матрицы и состоит из простых численных арифметических операций. Умножение матрицы вращения на текущую матрицу может быть представлено как последовательное изменение элементов с номерами &amp;lt;math&amp;gt;ik&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;kk&amp;lt;/math&amp;gt; для всех столбцов &amp;lt;math&amp;gt;k&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;
Пусть матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; - матрица, для которой мы хотим найти собственные значения. Тогда итерационный процесс строится следующим образом:&lt;br /&gt;
#&amp;lt;math&amp;gt;A_0=A&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;
::::*Строится QR-разложение: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;&lt;br /&gt;
::::*Вычисляется &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k={Q_{k}^{-1}}Q_kR_kQ_k={Q_{k}^{-1}}A_kQ_k={Q_{k}^{T}}A_kQ_k&amp;lt;/math&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Таким образом матрицы &amp;lt;math&amp;gt;A_{k+1}&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны для &amp;lt;math&amp;gt;\forall k&amp;lt;/math&amp;gt;, а значит, в силу транзитивности подобия, все матрицы &amp;lt;math&amp;gt;A_{k}&amp;lt;/math&amp;gt; подобны матрице &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;\forall m&amp;lt;/math&amp;gt; выполнены следующие условия:&lt;br /&gt;
&lt;br /&gt;
::1. &amp;lt;math&amp;gt;A=X\Lambda X^{-1}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\Lambda =\begin{bmatrix}&lt;br /&gt;
\Lambda_1 &amp;amp; 0\\ &lt;br /&gt;
0 &amp;amp; \Lambda_2 &lt;br /&gt;
\end{bmatrix}, \Lambda_1\in\mathbb{C}^{m\times m},\Lambda_2\in\mathbb{C}^{r\times r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::2. &amp;lt;math&amp;gt;\left | \lambda_1  \right | \geq ...\geq \left | \lambda_m  \right | &amp;gt;\left | \lambda_{m+1}  \right | \geq ...\geq  \left | \lambda_{m+r}  \right | &amp;gt; 0 &amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;\{\lambda_1,...,\lambda_m\} = \lambda(\Lambda_1), \{\lambda_{m+1},...,\lambda_{m+r}\} = \lambda(\Lambda_2) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::3. Ведущая подматрица порядка &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; в &amp;lt;math&amp;gt;X^{-1}&amp;lt;/math&amp;gt; невырождена&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Тогда при &amp;lt;math&amp;gt; k \rightarrow \infty &amp;lt;/math&amp;gt; последовательность матриц &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; сходится к матрице с верхней треугольной формой&amp;lt;ref&amp;gt;Тыртышников Е.Е. &amp;quot;Методы численного анализа&amp;quot; — М., Академия, 2007. - 320 c.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, на практике необходимо выполнять итерации до тех пор пока матрица &amp;lt;math&amp;gt;A_k&amp;lt;/math&amp;gt; не станет треугольной (также можно продолжать выполнять их пока искомая матрица не будет найдена с некоторой заранее заданной точностью &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;). Если итерации закончились на шаге &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то числа на диагонали матрицы &amp;lt;math&amp;gt;A_N&amp;lt;/math&amp;gt; будут считаться собственными значениями матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Вещественный вариант QR-алгоритма ====&lt;br /&gt;
&lt;br /&gt;
Если вещественная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; имеет различные вещественные собственные значения, то, как было описано ранее, QR-алгоритм сходится к матрице с верхней треугольной формой, на диагонали которой находятся собственные значения. Однако вещественная матрица может иметь комплексные собственные значения. В данном случае алгоритм будет сходиться не к верхней треугольной матрице, а к блочной верхней треугольной матрице, которая на диагонали содержит блоки 1-го и 2-го порядка. Блоки 1-го порядка содержат различные вещественные собственные значения, блоки 2-го порядка соответствуют парам комплексных сопряженных собственных значений&amp;lt;ref&amp;gt;R. Granat, Bo Kagstrom, D. Kressner &amp;quot;LAPACK Working Note #216: A novel parallel QR algorithm for hybrid distributed memory HPC systems&amp;quot;&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A_N=  &lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
 \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \bullet&amp;amp;  \bullet&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \vdots\\ &lt;br /&gt;
 \vdots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  0&amp;amp;  \blacksquare&amp;amp;  \blacksquare&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 \vdots&amp;amp;   \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp;  \ddots&amp;amp; \bullet\\ &lt;br /&gt;
 0&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  \cdots&amp;amp;  0&amp;amp;  0&amp;amp; \blacksquare&lt;br /&gt;
\end{bmatrix}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В дальнейшем, в данной статье, матрицы, имеющие вышеописанную форму, будут называться квазитреугольными.&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
QR-алгоритм обладает двумя вычислительными ядрами, которые повторяются на каждой итерации:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;. Существует несколько методов решения данной задачи:&lt;br /&gt;
* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из операций скалярного произведения, необходимых для вычисления матрицы отражения, и из опреаций скалярного произведения, необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]&lt;br /&gt;
::Вычислительное ядро данного алгоритма состоит из численных арифметических операций, необходимых для вычисления параметров матрицы вращения, и из операций (эквивалентных перемножению комплексных чисел), необходимых для пересчета матрицы на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
2. [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение]] двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Как уже было описано ранее, QR-алгоритм содержит в себе две макрооперации:&lt;br /&gt;
&lt;br /&gt;
1.Вычисление QR-разложения матрицы: &amp;lt;math&amp;gt;A_k=Q_kR_k&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.Перемножение двух плотных матриц: &amp;lt;math&amp;gt;A_{k+1}=R_kQ_k&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Опишем необходимый для реализации цикл при помощи псевдокода:&lt;br /&gt;
&lt;br /&gt;
 A - исходная матрица&lt;br /&gt;
 curA - текущая матрица, на основе которой будет вычисляться QR-разложение на каждом шаге&lt;br /&gt;
 nextA - новая матрица, полученная после перемножения матриц R и Q &lt;br /&gt;
 triangular - функция, проверяющая, имеет ли матрица квазитреугольную форму.&lt;br /&gt;
 difference - функция, проверяющая, что элементы двух матриц, стоящие на одинаковых местах, различаются не более чем на eps (данная функция нужна чтобы проверять не только сходимость матрицы к квазитреугольной форме, но и сходимость ее ненулевых элементов).&lt;br /&gt;
&lt;br /&gt;
 curA = A&lt;br /&gt;
 nextA = A&lt;br /&gt;
 &#039;&#039;&#039;while&#039;&#039;&#039; ( &#039;&#039;&#039;not&#039;&#039;&#039; (triangular(nextA) &amp;amp; difference(curA,nextA,eps)) )&lt;br /&gt;
 {&lt;br /&gt;
     curA = nextA&lt;br /&gt;
     findQRdecomposition(curA,Q,R)&lt;br /&gt;
     nextA = R*Q&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
Подсчитаем сложность одной итерации QR-алгоритма (расчет сложностей для QR-разложения и перемножения матриц представлен в статьях, посвященных данным алгоритмам)&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет сложность   &amp;lt;math&amp;gt;\frac{4}{3}n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет сложность   &amp;lt;math&amp;gt;2n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет сложность   &amp;lt;math&amp;gt;n^3&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на квазитреугольную форму состоит из набора сравнений элементов с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;   (&amp;lt;math&amp;gt;i&amp;gt;j+1&amp;lt;/math&amp;gt;) с нулем (таких элементов &amp;lt;math&amp;gt;\frac{(n-2)(n-1)}{2}&amp;lt;/math&amp;gt;). Поддиагональные элементы с номерами &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt;  (&amp;lt;math&amp;gt;i=j+1&amp;lt;/math&amp;gt;) должны быть проверены на соответствие необходимой квазитреугольной форме. Для этого достаточно для каждого такого элемента проверить следующее условие: &amp;lt;math&amp;gt;a_{i+1,i}==0 \vee a_{i,i-1}==0  \wedge a_{i+2,i+1}==0&amp;lt;/math&amp;gt; (либо поддиагональный элемент равен 0, либо, в противном случае, соседние поддиагональные элементы равны 0, чтобы текущий элемент соответствовал блоку 2-го порядка). Таких проверок поддиагональных элементов будет &amp;lt;math&amp;gt;n-1&amp;lt;/math&amp;gt;. После данных проверок следует набор логических операций &amp;quot;И&amp;quot; между результатами всех сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n-1)}{2}-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
# Сравнение новой матрицы с предыдущей состоит из операций вычитания и сравнения для каждой пары ненулевых соответствующих элементов (такие пары имеют номера элементов &amp;lt;math&amp;gt;ij&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;i \geq j+1&amp;lt;/math&amp;gt;), количество таких пар равно &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)&amp;lt;/math&amp;gt;), а также из набора логических операций &amp;quot;И&amp;quot; между результатами сравнений (таких операций будет &amp;lt;math&amp;gt;\frac{n(n+1)}{2}+(n-1)-1&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Итого, в сумме получаем &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; - сложность алгоритма на каждой итерации. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&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;
----&lt;br /&gt;
&lt;br /&gt;
На рисунке ниже изображен информационный граф QR-алгоритма. Вершины данного графа обозначают следующее:&lt;br /&gt;
* &#039;&#039;&#039;QR&#039;&#039;&#039; - операция QR-разложения матрицы&lt;br /&gt;
* &#039;&#039;&#039; *&amp;lt;sub&amp;gt;M&amp;lt;/sub&amp;gt;&#039;&#039;&#039; - операция перемножения матриц&lt;br /&gt;
* &#039;&#039;&#039;Triang&#039;&#039;&#039; - операция проверки матрицы на квазитреугольную форму&lt;br /&gt;
* &#039;&#039;&#039;Dif&#039;&#039;&#039; - операция проверки различия элементов двух матриц не более чем на некоторое заданное число&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf.png|center|frame|Информационный граф QR-алгоритма]]&lt;br /&gt;
&lt;br /&gt;
Подробные графы операций QR-разложения ([[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]], [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]]) и [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|перемножения]] матриц можно найти в статьях, посвященных этим алгоритмам. Далее рассмотрим информационные графы операций &#039;&#039;&#039;Triang&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039; на примере матрицы размера &amp;lt;math&amp;gt;5 \times 5&amp;lt;/math&amp;gt;. Графы для других матриц выглядят аналогичным образом.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Triang.png|center|frame|Информационный граф операции &#039;&#039;&#039;Triang&#039;&#039;&#039;, которая проверяет соответствие квазитреугольной форме]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;V&#039;&#039;&#039; соответствуют операции сравнения с 0. Вершины &#039;&#039;&#039;F&#039;&#039;&#039; соответствуют проверке поддиагональных элементов на соответствие квазитреугольной форме, которая была описана в предыдущем разделе. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:QR_Alg_Graf_Dif2.png|center|frame|Информационный граф операции &#039;&#039;&#039;Dif&#039;&#039;&#039;, которая проверяет сходимость ненулевых элементов]]&lt;br /&gt;
&lt;br /&gt;
Вершины &#039;&#039;&#039;-V&#039;&#039;&#039; соответствуют операции вычитания и сравнения с 0. Вершины &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; соответствуют логической операции &amp;quot;И&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
На макроуровне (который можно увидеть на информационном графе QR-алгоритма) алгоритм не обладает ресурсами параллелизма. Все макрооперации внутри итерации, а также сами итерации выполняются последовательно (за исключением операций &#039;&#039;&#039;Triag&#039;&#039;&#039; и &#039;&#039;&#039;Dif&#039;&#039;&#039;, которые могут выполняться параллельно). Основной ресурс параллелизма заложен отдельно в каждой из макроопераций. На каждой итерации алгоритм имеет следующие параллельные характеристики:&lt;br /&gt;
&lt;br /&gt;
# QR-разложение матрицы (описание ресурсов параллелизма для алгоритмов QR-разложения можно найти в статьях, посвященных этим алгоритмам)&lt;br /&gt;
#* [[Метод_Хаусхолдера_(отражений)_QR-разложения_квадратной_матрицы,_вещественный_вариант|Метод Хаусхолдера (отражений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
#* [[Метод_Гивенса_(вращений)_QR-разложения_квадратной_матрицы_(вещественный_вариант)|Метод Гивенса (вращений)]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;11n-16&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
# [[Перемножение_плотных_неособенных_матриц_(последовательный_вещественный_вариант)|Перемножение двух плотных матриц]] имеет высоту ярусно-параллельной формы &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; и ширину ярусно-параллельной формы &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt;&lt;br /&gt;
# Проверка матрицы на выходе из итерации&lt;br /&gt;
#* Проверка матрицы на квазитреугольную форму состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Для вычисления итогового результата можно использовать метод сдваивания, который дает высоту ярусно-параллельной формы порядка логарифма от количества элементов, над которыми совершается операция. Таким образов высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе ссравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
#* Сравнение новой матрицы с предыдущей состоит из одного яруса сравнений для каждого элемента и последующих ярусов, вычисляющих итоговый результат при помощи логической операции &amp;quot;И&amp;quot;. Высота ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(log_2n)&amp;lt;/math&amp;gt;. Ширина ярусно-параллельной формы достигается на ярусе сравнений для каждого элемента и равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, основной вклад в высоту ярусно-параллельной формы одной итерации вносит операция QR-разложения матрицы и она будет равна &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, если использовать метод Гивенса. Ширина ярусно-параллельной формы будет равна &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;. Если алгоритм остановился на итерации с номером &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, то параллельные характеристики для всего алгоритма будут равны &amp;lt;math&amp;gt;N*O(n)&amp;lt;/math&amp;gt; для высоты и &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; для ширины ярусно-параллельной формы.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Входные данные&#039;&#039;&#039;: &lt;br /&gt;
:::квадратная вещественная плотная матрица &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;: &amp;lt;math&amp;gt;A \in \R^{n \times n}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем входных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; (необходимо хранить все элементы матрицы)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Выходные данные&#039;&#039;&#039;: &lt;br /&gt;
:::собственные значения матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Объем выходных данных&#039;&#039;&#039;: &lt;br /&gt;
:::&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (квадратная матрица размера &amp;lt;math&amp;gt;n \times n&amp;lt;/math&amp;gt; имеет ровно &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; собственных значений при этом некоторые из них могут быть комплексными)&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
----&lt;br /&gt;
*Cоотношение последовательной и параллельной сложности алгоритма квадратично, что дает довольно большой выигрыш.&lt;br /&gt;
*Вычислительная мощность, которая показывает, сколько операций приходится на единицу переданных данных, равна &amp;lt;math&amp;gt;\frac{N*O(n^3)}{n^2+n}=N*O(n)&amp;lt;/math&amp;gt;, а значит перемещение данных для их обработки не будет составлять большой проблемы.&lt;br /&gt;
*Алгоритм является недетерминированным, т.к. заранее неизвестно сколько итераций необходимо совершить до момента сходимости.&lt;br /&gt;
*Скорость сходимости алгоритма зависит от собственных значений. Чем ближе по модулю соседние собственные значения, тем меньше скорость сходимости. Этот недостаток призван решить QR-алгоритм со сдвигами.&lt;br /&gt;
&lt;br /&gt;
== ЧАСТЬ. Программная реализация алгоритма ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
==== Последовательные реализации ====&lt;br /&gt;
&lt;br /&gt;
# LAPACK ([http://netlib.org/lapack/ Linear Algebra PACKage]) — библиотека с открытым исходным кодом, содержащая методы для решения основных задач линейной алгебры. Написана на языке Fortran с использованием библиотеки [http://www.netlib.org/blas/ BLAS] и является развитием пакета LINPACK. Находится в открытом доступе в соответствии с [http://www.netlib.org/lapack/LICENSE.txt модифицированной лицензией BSD], в том числе и для коммерческого использования. &lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/lapack/explore-html/d8/d66/dhseqr_8f_a273e6c6bdb731ed8d6ba3cb060f3f739.html#a273e6c6bdb731ed8d6ba3cb060f3f739 dhseqr] &lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b dgeqrf] &lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/lapack/explore-html/d1/d54/group__double__blas__level3_gaeda3cbd99c8fb834a60a6412878226e1.html#gaeda3cbd99c8fb834a60a6412878226e1 dgemm] &lt;br /&gt;
# [http://alglib.sources.ru/ ALGLIB] - это кросс-платформенная библиотека численного анализа, поддерживающая несколько языков программирования (C++, C#, Pascal, VBA) и несколько операционных систем (Windows, Linux, Solaris). ALGLIB является свободным программным обеспечением, которое использует двойное лицензирование: оно может быть использовано в соответствии с лицензией GPL (версии 2+), а для использования в коммерческих целях необходимо купить отдельную лицензию.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: подпрограмма [http://alglib.sources.ru/eigen/nonsymmetric/nonsymmetricevd.php RMatrixEVD] &lt;br /&gt;
#* QR-разложение: подпрограмма [http://alglib.sources.ru/matrixops/qr.php  rmatrixqr] реализует QR-разложение для вещественных матриц, [http://alglib.sources.ru/matrixops/qr.php cmatrixqr] – для комплексных матриц &lt;br /&gt;
#* Перемножение матриц: для перемножения матриц ALGLIB использует соответствующую реализацию библиотеки [http://www.netlib.org/blas/ BLAS]&lt;br /&gt;
# [http://eigen.tuxfamily.org/index.php?title=Main_Page Eigen] – библиотека шаблонов для линейной алгебры, написанная на языке C++. Eigen – свободно распространяемое программное обеспечение. Начиная с версии 3.1.1, оно лицензируется MPL2, на ранние версии распространяется действие лицензии LGPL3+.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: модуль [http://eigen.tuxfamily.org/dox/group__Eigenvalues__Module.html Eigenvalues module] &lt;br /&gt;
#* QR-разложение: модуль [http://eigen.tuxfamily.org/dox-devel/group__QR__Module.html  QR module]&lt;br /&gt;
#* Перемножение матриц: [http://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html#title5  операторы * и *=]&lt;br /&gt;
&lt;br /&gt;
==== Параллельные реализации ====&lt;br /&gt;
# ScaLAPACK ([http://www.netlib.org/scalapack/ Scalable Linear Algebra PACKage]) — библиотека с открытым исходным кодом, включающая в себя подмножество процедур [http://netlib.org/lapack/ LAPACK], переработанных для использования на MPP-компьютерах. ScaLAPACK разработана с использованием PBLAS и BLACS, и предназначена для вычислений на любом компьютере или кластере поддерживающим MPI или PVM. Библиотека в настоящее время написана на языке Fortran. Находится в открытом доступе в соответствии с [http://www.netlib.org/scalapack/LICENSE модифицированной лицензией BSD], в том числе и для коммерческого использования.&lt;br /&gt;
#* Полный алгоритм нахождения собственных значений: функция [http://www.netlib.org/scalapack/explore-html/d3/d3a/pdhseqr_8f.html#a2dbf17fffb167fe38d2a0544bb9fd5db pdhseqr]&lt;br /&gt;
#* QR-разложение: функция [http://www.netlib.org/scalapack/explore-html/da/d85/pdgeqrf_8f.html#ad48b15b5976e51cbc40a0e1ab2720fa5 pdgeqrf]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.netlib.org/scalapack/explore-html/d6/da2/pdgemm___8c.html#a2959b3974ab5e83564517aa1b99d2433 pdgemm]&lt;br /&gt;
# PLAPACK ([http://www.cs.utexas.edu/users/plapack/ Parallel Linear Algebra Package]) — пакет функций LAPACK для параллельного решения задач линейной алгебры. Пакет функций PLAPACK является альтернативой библиотеке [http://www.netlib.org/scalapack/ ScaLAPACK]. Для осуществления межпроцессорных коммуникаций в PLAPACK использован интерфейс передачи сообщений MPI. При передаче сообщений в PLAPACK в основном используются коллективные операции, такие, как обобщенная передача данных от одного процесса всем процессам  (MPI_Scatter), обобщенная передача данных от всех процессов одному процессу (MPI_Gather), широковещательная рассылка (MPI_Bcast) и другие. PLAPACK включает интерфейсы для языков Fortran и С. &lt;br /&gt;
#* QR-разложение: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_QR PLA_QR]&lt;br /&gt;
#* Перемножение матриц: функция [http://www.cs.utexas.edu/users/plapack/C_Manual/#PLA_Gemm PLA_Gemm]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;/div&gt;</summary>
		<author><name>Александра Киямова</name></author>
	</entry>
</feed>